2012-07-11 72 views
1

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

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

但问题是,在Windows中我得到一个类型的输出,而当我在UNIX机器上运行的程序,我得到一个不同类型的输出。 如:

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

但是在UNIX中,我所得到的是,

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

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

+0

虽然我不知道为什么这是,我很好奇,为什么这会导致你的问题。你的程序是否期望特定的属性顺序? – Utkanos 2012-07-11 10:20:10

+0

我认为这将有助于我们看到XML输入文件和XSLT文件,谢谢! – 2012-07-11 10:33:23

+0

在XML中,元素的属性集中没有定义标准排序 - 这可能因实现而异。另外,如果两个XML文档之间的唯一区别是属性顺序,则它们被认为是“相等的” - 例如XPath 2.0函数deep-equal($ doc1,$ doc2)'生成true()'。即使发现某些特性按照特定的顺序出现在XML解析器和XSLT处理器的特定实现中),但这种破解并不能保证与本实现的下一个版本一起工作。 – 2012-07-11 12:15:57

回答

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处理器的特定顺序出现了一些黑客攻击),但这种攻击并不能保证与下一版本实现。