更改xml属性的顺序

时间:2012-07-11 09:37:49

标签: xml xslt

我正在使用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" />

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

1 个答案:

答案 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不能保证与该实现的下一版本一起使用。