1

我正在使用 xslt 转换来转换一些 xml 文件。为了格式化输出,我使用的是 xsl 样式表中的两个标签。

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

但问题是,在 Windows 中我得到了一种输出,而当我在 unix 机器上运行程序时,我得到了另一种输出。例如:

<Book name="Godfather" author="MarioPuzo"/>

但是在unix中,我得到的是,

<Book author="MarioPuzo" name="Godfather" />

这是一个奇怪的问题。任何帮助表示赞赏。

4

1 回答 1

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 以特定顺序出现的属性),但不能保证这种 hack 可以与该实现的下一个版本一起使用。

于 2012-07-11T12:25:31.790 回答