在 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 可以与该实现的下一个版本一起使用。