我有一些形式的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中找到了限制。
答案 0 :(得分:2)
用此测试:
# I could have read these from a file I suppose...
set in {<definitions devices="myDevice">
<reg offset="0x0000" mnem="someRegister">
<field mnem="someField" msb="31" lsb="24" />
</reg>
</definitions>}
set ss {<?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">
<xsl:text>#define </xsl:text>
<xsl:value-of select="translate(@mnem,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<xsl:text xml:space="preserve"> </xsl:text>
<xsl:value-of select="@offset"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>}
# Interesting code starts here
package require tdom
set indoc [dom parse $in]
set xslt [dom parse -keepEmpties $ss]
set outdoc [$indoc xslt $xslt]
puts [$outdoc asText]
我发现这很有效。问题是tDOM解析器没有正确处理xml:space
属性;如果没有神奇的-keepEmpties
选项, all 会从样式表中删除空字符串,这会导致应用错误的XSLT样式表。但使用选项,似乎做对了。
请注意,XSLT引擎本身正在做正确的事情。它是XML解析器/ DOM构建器。 (我认为这是一个错误;我会查找报告的位置。)
答案 1 :(得分:0)
每页: http://www.ibm.com/developerworks/xml/library/x-tipwhitesp/index.html
尝试使用保留空间指令:
<?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">
<xsl:text xml:space="preserve">#define </xsl:text>
<xsl:value-of select="translate(@mnem,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<xsl:text xml:space="preserve"> </xsl:text>
<xsl:value-of select="@offset"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
您没有在第二个样式表中指定输出方法,因此默认值为XML。我建议你使用输出方法“text”,然后使用<xsl:text>
元素作为任何文字输出。检查此示例:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each select="definitions/reg"><xsl:text>#define </xsl:text><xsl:value-of select="translate(@mnem,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/><xsl:text> </xsl:text><xsl:value-of select="@offset"/><xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
编辑:顺便说一句,最后
是一个字符代码。它只是换行符的ASCII码的十进制值。这可确保您为下一个reg条目开始一个新行。如果您需要Windows / DOS约定(回车+换行),请改用
。