[英]XSLT sort child nodes under different parent nodes
我正在嘗試使用xslt對xml進行排序,但是問題是我的代碼僅對特定節點下的元素進行了排序,這是一個示例xml:
<region name="Germany">
<company name="Mercedes" rank="2" />
<company name="BMW" rank="3" />
</region>
<region name="Japan">
<company name="Toyota" rank="1" />
<company name="Mazda" rank="4" />
</region>
我嘗試了以下操作,但沒有成功
<xsl:template match="region">
<Companies>
<xsl:for-each select="company">
<xsl:sort select="@rank" />
<xsl:call-template name="companies">
</xsl:for-each>
</Companies>
</xsl:template>
<xsl:template name="companies">
<Company>
<xsl:value-of select="@name" />
</Company>
</xsl:template>
輸出應為:
<Companies>
<Company>Toyota</Company>
<Company>Mercedes</Company>
<Company>BMW</Company>
<Company>Mazda</Company>
</Companies>
從輸出看來,您似乎要按等級而不是名稱進行排序。
關於隨節點進行的排序,因為您的模板正在每個區域運行,所以排序是針對一個區域內的公司節點。 您可以為區域的父級運行模板,然后遍歷元素並按名稱排序。 這是帶有匹配輸出的模板。
<xsl:template match="*[region]">
<Companies>
<xsl:for-each select="region/company">
<xsl:sort select="@rank" />
<xsl:call-template name="companies" />
</xsl:for-each>
</Companies>
</xsl:template>
<xsl:template name="companies">
<Company>
<xsl:value-of select="@name" />
</Company>
</xsl:template>
您沒有顯示這些region
元素的任何容器元素,但是假設您將它們包含在一個公共容器中,請編寫一個與該容器匹配的模板(例如,在下面的示例代碼中命名為root
),然后我建議將模板應用於company
根據rank
屬性包含xsl:sort
孫子代。
然后添加一個模板,該模板從基於屬性的company
輸入元素轉換為基於值的元素,您將完成:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="root">
<Companies>
<xsl:apply-templates select="region/company">
<xsl:sort select="xs:integer(@rank)"/>
</xsl:apply-templates>
</Companies>
</xsl:template>
<xsl:template match="company">
<xsl:copy>
<xsl:value-of select="@name"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/94rmq6B
如果要以一種排序的方式一起處理所有region
則在每個region
匹配似乎沒有任何意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.