1

xslt 変換を使用して、いくつかの xml ファイルを変換しています。出力をフォーマットするために、xsl スタイル シートの 2 つのタグを使用しています。

<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 では、要素の一連の属性で定義された標準的な順序付けはありません。これは、実装ごとに異なる場合があります。

また、2 つの XML ドキュメントの唯一の違いが属性の順序である場合、それらは「等しい」と見なされます。たとえば、XPath 2.0 関数 deep-equal($doc1, $doc2) は true() を生成します。

これはクラス定義に似ています。プロパティ (またはメソッド) の順序のみが異なる 2 つのクラス定義は同じクラス定義であり、インスタンスを使用するプログラムと異なる結果を生じることなく、互いに置き換えることができます。このクラス定義。

以下は、属性の順序のみが異なる場合、2 つのドキュメントが「等しい」と見なされるという事実のデモです。

<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 プロセッサの両方の特定の実装で属性が特定の順序で表示されるハックが見つかったとしても、このハックがこの実装の次のバージョンで動作することは保証されません。

于 2012-07-11T12:25:31.790 に答える