我想根據選單的“識別符號”和“專案”元素修改 XML 檔案。
如果輸入 XML 檔案中的另一個選單項中存在選單的“識別符號”,則應將選單背景關系復制到輸出 XML 檔案中的父選單下方,并且順序應與父項相同。
'label' 的選單元素應改為'level_xx'。'xx' 為層級編號,詳細請參考excel 截圖。
任何人都可以幫助我如何使用 XSL1.0 實作這一目標。
輸入 XML 檔案:
<input>
<menu>
<identifier>1</identifier>
<label>"1"</label>
<items>
<item>2</item>
<item>3</item>
</items>
</menu>
<menu>
<identifier>2</identifier>
<label>"2"</label>
<items>
<item>21</item>
<item>22</item>
<item>3</item>
</items>
</menu>
<menu>
<identifier>3</identifier>
<label>"3"</label>
<items>
<item>31</item>
<item>32</item>
</items>
</menu>
<menu>
<identifier>21</identifier>
<label>"21"</label>
<items>
<item>211</item>
<item>212</item>
</items>
</menu>
<menu>
<identifier>22</identifier>
<label>"22"</label>
<items>
<item>221</item>
<item>222</item>
</items>
</menu>
<menu>
<identifier>31</identifier>
<label>"31"</label>
<items>
<item>311</item>
<item>312</item>
</items>
</menu>
<menu>
<identifier>32</identifier>
<label>"32"</label>
<items>
<item>321</item>
<item>322</item>
</items>
</menu>
</input>
輸出 XML 檔案:
<input>
<menu>
<identifier>1</identifier>
<level_01>"1"</level_01>
<items>
<item>2</item>
<item>3</item>
</items>
</menu>
<menu>
<identifier>2</identifier>
<level_02>"2"</level_02>
<items>
<item>21</item>
<item>22</item>
<item>3</item>
</items>
</menu>
<menu>
<identifier>21</identifier>
<level_03>"21"</level_03>
<items>
<item>211</item>
<item>212</item>
</items>
</menu>
<menu>
<identifier>22</identifier>
<level_03>"22"</level_03>
<items>
<item>221</item>
<item>222</item>
</items>
</menu>
<menu>
<identifier>3</identifier>
<level_03>"3"</level_03>
<items>
<item>31</item>
<item>32</item>
</items>
</menu>
<menu>
<identifier>31</identifier>
<level_04>"31"</level_04>
<items>
<item>311</item>
<item>312</item>
</items>
</menu>
<menu>
<identifier>32</identifier>
<level_04>"32"</level_04>
<items>
<item>321</item>
<item>322</item>
</items>
</menu>
<menu>
<identifier>3</identifier>
<level_02>"3"</level_02>
<items>
<item>31</item>
<item>32</item>
</items>
</menu>
<menu>
<identifier>31</identifier>
<level_03>"31"</level_03>
<items>
<item>311</item>
<item>312</item>
</items>
</menu>
<menu>
<identifier>32</identifier>
<level_03>"32"</level_03>
<items>
<item>321</item>
<item>322</item>
</items>
</menu>
</input>
輸出的電平資訊
uj5u.com熱心網友回復:
假設您的輸入 XML 實際上如下所示:
XML
<input>
<menu>
<identifier>1</identifier>
<label>"1"</label>
<items>
<item>2</item>
<item>3</item>
</items>
</menu>
<menu>
<identifier>2</identifier>
<label>"2"</label>
<items>
<item>21</item>
<item>22</item>
</items>
</menu>
<menu>
<identifier>3</identifier>
<label>"3"</label>
<items>
<item>31</item>
<item>32</item>
</items>
</menu>
<menu>
<identifier>21</identifier>
<label>"21"</label>
<items>
<item>211</item>
<item>212</item>
</items>
</menu>
<menu>
<identifier>22</identifier>
<label>"22"</label>
<items>
<item>221</item>
<item>222</item>
</items>
</menu>
<menu>
<identifier>31</identifier>
<label>"31"</label>
<items>
<item>311</item>
<item>312</item>
</items>
</menu>
<menu>
<identifier>32</identifier>
<label>"32"</label>
<items>
<item>321</item>
<item>322</item>
</items>
</menu>
</input>
您可以根據之前的問題調整答案并執行以下操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="children" match="menu" use="identifier" />
<xsl:key name="parent" match="menu" use="items/item" />
<xsl:template match="/input">
<xsl:copy>
<xsl:apply-templates select="menu[not(key('parent', identifier))]">
<xsl:with-param name="level" select="1"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="menu">
<xsl:param name="level"/>
<xsl:copy>
<xsl:copy-of select="identifier"/>
<xsl:element name="level_{format-number($level, '00')}">
<xsl:value-of select="label" />
</xsl:element>
<xsl:copy-of select="items"/>
</xsl:copy>
<xsl:apply-templates select="key('children', items/item)">
<xsl:with-param name="level" select="$level 1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
添加:
如果您需要子元素以與元素內的元素menu相同的順序列出,則更改此部分:itemitems
<xsl:apply-templates select="key('children', items/item)">
<xsl:with-param name="level" select="$level 1"/>
</xsl:apply-templates>
到:
<xsl:for-each select="items/item">
<xsl:apply-templates select="key('children', .)">
<xsl:with-param name="level" select="$level 1"/>
</xsl:apply-templates>
</xsl:for-each>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459328.html
上一篇:如何簡化相同的代碼塊?
下一篇:將決議的XML結果寫入CSV
