Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用tDOM将包含空格的XSLT转换应用于XML文档?_Xslt_Tcl_Tdom - Fatal编程技术网

如何使用tDOM将包含空格的XSLT转换应用于XML文档?

如何使用tDOM将包含空格的XSLT转换应用于XML文档?,xslt,tcl,tdom,Xslt,Tcl,Tdom,我有一些XML的形式: <definitions devices="myDevice"> <reg offset="0x0000" mnem="someRegister"> <field mnem="someField" msb="31" lsb="24 /> ... </reg> ... </definitions> 但我实际上得到: #define SOMEREGISTER0

我有一些XML的形式:

<definitions devices="myDevice">
    <reg offset="0x0000" mnem="someRegister">
        <field mnem="someField" msb="31" lsb="24 />
        ...
    </reg>
    ...
</definitions>
但我实际上得到:

#define SOMEREGISTER0x0000
我不明白为什么在“#define”后面有空格,而在转换后的助记符后面没有空格。我尝试了一个更简单的解决方案,只使用了一个内联空间,得到了相同的结果

我对这个(XSLT)太陌生了,不知道我是a)做错了还是b)发现了限制。

Per:

尝试使用“保留空间”指令:

<?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>

#定义

您没有在第二个样式表中指定输出方法,因此默认为XML。我建议您使用输出方法“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>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

#定义
;
编辑:顺便说一下,

末尾是字符代码。它只是换行的ASCII码的十进制值。这确保您为下一个注册表条目启动新行。如果需要Windows/DOS惯例(回车+换行),请使用


使用以下方法进行测试:

#我想我可以从一个文件中读到这些。。。
开始{
}
设置ss{
#定义
}
#有趣的代码从这里开始
包需要时差
设置indoc[dom parse$in]
设置xslt[dom解析-keepopties$ss]
set outdoc[$indoc xslt$xslt]
卖出[$outdoc asText]
我发现这是可行的。问题是tDOM解析器不能正确处理
xml:space
属性;如果没有神奇的
-keepopties
选项,所有空字符串都将从样式表中剥离,这将导致应用错误的XSLT样式表。但有了这个选项,它似乎做了正确的事情


请注意,XSLT引擎本身正在做正确的事情。它是XML解析器/DOM构建器。(我认为这是一个bug;我将查找报告它的位置。)

正确的想法,错误的实现。HTML实体对XSLT没有任何意义,但解释了如何做到这一点。尽管@G_H的回复可能是更正确的解决方案。抱歉-上述评论针对的是一个现在已经消失(!?)(或者完全被取代了?)的答案。是的,有人建议使用
。我对XML和XSLT中的空白也有点粗略,但我猜当解释XSLT时,某些处理器会删除一些“可忽略”的空白。使用
xml:space
可以解决这个问题。输入和样式表都是XML这一事实可能会令人困惑。但是,如果没有指定输出方法,并且没有检测到输出为HTML,则默认为XML。如果您打算输出文本,那么这样说更安全;就是让我得到我想要的空间,而不引入一个似乎打破新行(隐含或文字)的。我本来希望继续指定助记符列的宽度(相当于“printf”(#define%20s 0x%04x),mnem,offset)),但现在想知道这有多实际。顺便说一句,这也可能取决于您的引擎。在我介绍一个..时,甚至您最初的示例也对MSXml起到了作用。。在任何地方,所有输出都在一行上(带或不带 ;)。用“od-t x1”查看输出表明存在一个 ;对输出流完全不执行任何操作。是否指定了输出方法“text”?我在XMLSpy中尝试了这个,它在那里起了作用。这可能与您正在使用的XSLT处理器有关。可能会检查已知问题或与规范的偏差?我确实指定了输出方法。processor()声称非常兼容,但它可能值得更仔细地研究,有时感觉每个XSLT处理器似乎都以自己独特的方式解释规范。或者,规范为解释留下了太多的空间。如果我们一起高呼迈克尔·凯的名字,他可能会带着一个真实的答案出现。多纳尔一如既往地很有帮助,谢谢。其他答案确实提供了一些有用的建议,可以解决问题,但这是最直接解决原始问题的答案;当空间被送入发动机时,它已经消失了,这让人大开眼界,有助于缩小真正的问题。:-)我们不需要为地球上的每一个图书馆都设置标签。@Charles:既然这个问题是该图书馆特有的(在Tcl世界中非常有名的一个图书馆),那么将其设置为标签当然是合理的?“这样做有什么害处?”克里斯,似乎有人提到了图书馆。这比我昨晚看到的多了六个,我一定是打错了什么。我用tdom(问题是关于tdom的,而不是答案)重新标记了它们中的大多数。我的“该标签不需要存在”阈值类似于1或2个问题。毕竟,我是一个新的标签删除者。
#define SOMEREGISTER0x0000
<?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>
<?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>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>