次の形式のXMLがあります。
<definitions devices="myDevice">
<reg offset="0x0000" mnem="someRegister">
<field mnem="someField" msb="31" lsb="24 />
...
</reg>
...
</definitions>
XMLを最も信頼のおけるリファレンスにし、XSLTを使用してドキュメント用のHTMLに変換し、.hをビルド用に(そしておそらく他の形式も)変換したいと思います。
HTMLバージョンは正常に機能しており、レジスタごとにテーブルを生成し、フィールドごとに行を作成します。
... (header boilerplate removed)
<xsl:for-each select="definitions/reg">
<table>
<tr>
<th><xsl:value-of select="@offset"/></th>
<th><xsl:value-of select="@mnem"/></th>
</tr>
<xsl:for-each select="field">
<tr>
<td><xsl:value-of select="@msb"/>..<xsl:value-of select="@lsb"/></td>
<td><xsl:value-of select="@mnem"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
.hへの変換はあまりうまくいきません。出力に必要なスペースを生成できませんでした。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="definitions/reg">
#define <xsl:value-of select="translate(@mnem,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@offset"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
私はそれが出力を生成することを望んでいます:
#define SOMEREGISTER 0x0000
しかし、私は実際に次のようになります。
#define SOMEREGISTER0x0000
'#define'の後にスペースを取得する理由はわかりませんが、変換されたニーモニックの後にスペースを取得するのはわかりません。インラインスペースだけを使用したより単純なソリューションを試しましたが、同じ結果が得られました。
私はこれ(XSLT)に慣れていないので、a)間違っているのか、b)tDOMの制限を見つけているのかを知ることができません。