2016-11-21 2 views
3

のポジショニングiのXMLドキュメントをコピーして、特定のノード に属性を追加しています(参照:xslt how to add attributes to copy-of)をXSLT:新しく追加された属性

シングは、Fe、私のノードは、すでにいくつかの既存の属性を持って、次のとおりです。

<element id="123" dbfield="table"> 

私は新しい属性を追加すると、それはちょうどそのよう、最初の属性の前に配置されます:

<element version="default" id="123" dbfield="table"> 

私がすることを好みます

<element id="123" dbfield="table" version="default"> 

新しい「バージョン」属性の位置を設定する方法はありますか?ご協力ありがとうございました!

+0

属性の順序は関係ありません。正確に何をしたいですか? – potame

+0

私の同僚はすべてその注文に慣れているので、必要でない場合は変更したくありません。これらの値のいくつかは時間から手動で設定されるため、私は注文を保つのが好きなのです。新しい属性を最後の属性として追加したいと思います。その例を参照してください。 – brun0

+0

@ brun0どのプロセッサを使用していますか? –

答えて

1

XML language specificationは、属性の順序が重要ではないことを明示的に述べているため、XSLT言語は属性の順序を制御する方法を提供しません。

<xsl:template match="element"> 
    <xsl:copy> 
     <xsl:attribute name="version">default</xsl:attribute> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
:あなただけの順序を変更する必要があるので、(おそらく、あなたの現在のコードを示さなかったとして、) -

それでも、ほとんどのプロセッサは、彼らに与えられた命令の順序で属性を書き出します

へ:サクソンの

<xsl:template match="element"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="version">default</xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
+0

既存の 'element'に既に' version'属性がある場合、これら2つのテンプレートルールは異なる効果を持つことに注意してください。同じ名前の2つの属性を書き込むと、最後の属性が勝ちます。 –

+0

ご協力いただきありがとうございます! – brun0

2

最近のバージョン(PEとEE)は、シリアル化プロパティsaxon:attribute-orderを有します。これらの名前に一致する属性が定義された順序でシリアル化され、その後にリストに存在しない属性が続くことを保証します。

受信ソフトウェアの動作が違うという意味で、属性の順序を重要なものとして扱うべきではないことは間違いありませんが、XMLの設計目標の1つは人間が読めるようにすることです一貫した属性の順序は、この目標を達成するのに役立ちます。

関連する問題