平臺:撒克遜9 - XSLT 2.0排序XML元素順序XSLT基於在外部文檔指定的順序
我有需要定期編輯,更新和保存3000個的XML文檔。
該過程的一部分包括在編輯之前從存儲庫中檢出文檔,並在編輯完成後定期發佈它。
每個文檔包含一系列單獨命名的部分,例如,
<part>
<meta>
<place_id>12345</place_id>
<place_name>London</place_name>
<country_id>GB</country_id>
<country_name>United Kingdom</country_name>
</meta>
<text>
<docs>some blurb</docs>
<airport>some blurb LGW LHR</airport>
<trains>some blurb</trains>
<hotels>some blurb</hotels>
<health>some blurb</health>
<attractions>some blurb</attractions>
</text>
</part>
在文本元素有近100部,並與所有的編輯團隊,他們改變主意的優先順序上偶爾,但經常,基礎。也許每年兩次。
目前,我們向當前首選編輯中的編輯提供XML文檔部分以進行編輯和發佈。這個順序被稱爲「stdhdg.xml」動態產生的外部文檔中指定,並且出現這樣的事:
<hdgs>
<hdg name="docs" newsort="10"/>
<hdg name="airport" newsort="30"/>
<hdg name="trains" newsort="20"/>
<hdg name="hotels" newsort="40"/>
<hdg name="health" newsort="60"/>
<hdg name="attractions" newsort="50"/>
</hdgs>
,其中,通過熱浸鍍鋅/ @ newsort規定的優選排序次序。
於是我就用一個模板像這樣以正確的順序
<xsl:template match="text">
<xsl:variable name="thetext" select="."/>
<xsl:variable name="stdhead" select="document('stdhdg.xml')"/>
<text>
<xsl:for-each select="$stdhead//hdg">
<xsl:sort data-type="number" order="ascending" select="@newsort"/>
<xsl:variable name="tagname" select="@name"/>
<xsl:variable name="thisnode" select="$thetext/*[local-name() = $tagname]"/>
<xsl:apply-templates select="$thisnode"/>
</xsl:for-each>
</text>
</xsl:template>
到過程,但它似乎非常緩慢和繁瑣的,我覺得我應該使用鍵加速這一過程。
是否有一個簡單/整潔的方式來做這個排序操作。
(請不要問我的方式來改變編輯的編輯,這是比我的生命更有價值)
TIA
Feargal
好問題,+1。請參閱我的答案,以獲得完全消除每次編輯之前重新排序的解決方案。 :) – 2010-12-16 15:43:21