我正在使用xslt转换来转换一些xml文件。为了格式化输出,我使用的是xsl样式表中的两个标记。
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
但问题是,在windows中我得到了一种输出,当我在unix机器上运行程序时,我得到了一种不同的输出。 例如:
<Book name="Godfather" author="MarioPuzo"
/&GT;
但是在unix中,我得到的是,
<Book author="MarioPuzo" name="Godfather" />
这是一个奇怪的问题。任何帮助表示赞赏。
答案 0 :(得分:1)
在XML中,元素属性集中没有定义标准排序 - 这可能与实现不同。
此外,如果两个XML文档之间的唯一区别是属性的顺序,则它们被视为“相等” - 例如,XPath 2.0函数deep-equal($ doc1,$ doc2)生成true()。
这类似于一个类定义 - 两个类定义,其中唯一的区别是属性(或方法)的顺序是相同的类定义,可以相互替换而不会导致任何程序的不同结果使用此类定义的实例。
以下是一个演示,如果唯一的区别是属性排序,那么两个文档被视为“相等”:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vDoc2">
<t y="2" x="1" />
</xsl:variable>
<xsl:template match="/">
<xsl:sequence select="deep-equal(/, $vDoc2)"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档:
<t x="1" y="2"/>
结果是:
true
即使某些黑客被发现属性以XML解析器和XSLT处理器的给定实现的特定顺序出现,但是这个hack不能保证与该实现的下一版本一起使用。