2016-11-21 43 views
3

我正在複製一個XML文檔和屬性添加到某些節點 (參見:xslt how to add attributes to copy-ofXSLT:新添加的屬性的定位

事情是,我的節點已經有一些現有屬性,FE:

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

當我添加一個新的屬性,它被定位在第一屬性的前面,就是這樣:

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

我寧願它作爲最後一個屬性,就像這樣:

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

有沒有一種方法來設置的新「版本」的位置-attribute?感謝您的幫助!

+0

屬性順序無關緊要。你想要做什麼? – potame

+0

我的所有同事都習慣了這個順序,所以如果不是必要的話,我不想改變它。其中一些值可以手動設置,這就是爲什麼我更喜歡保持訂單。我希望添加新的屬性作爲最後一個屬性,請參閱示例。 – brun0

+0

@ brun0您使用哪種特定的處理器? –

回答

1

XSLT語言不提供控制屬性順序的方法,因爲XML language specification明確指出屬性順序不重要。

儘管如此,大多數處理器將寫出在給他們的指示順序的屬性 - 所以你只需要順序從改變(大概,因爲你並沒有顯示你當前的代碼):

<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'屬性,則這兩個模板規則會有不同的效果。當你寫出兩個同名的屬性時,最後一個獲勝。 –

+0

謝謝你們的幫助! – brun0

2

最新版本(PE和EE)有一個序列化屬性saxon:attribute-order。寫作:

<xsl:output saxon:attribute-order="id dbfield version"/> 

將確保匹配這些名字中的屬性定義的順序被序列化,其次是不存在列表中的屬性。

儘管確實不應該將屬性順序視爲引起接收軟件行爲不同的重要因素,但我同意您的觀點,即XML的設計目標之一是人類可讀的,並且使用一致的屬性順序有助於實現這一目標。