2012-07-11 58 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處理器的特定順序出現了一些黑客攻擊),但這種攻擊並不能保證與下一版本實現。