簡體   English   中英

XSLT對不同父節點下的子節點進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM