簡體   English   中英

XSLT:合並兄弟節點的子元素

[英]XSLT: Merge child elements of sibling nodes

我對XSLT有點陌生,但是我試圖將同級節點的子元素合並到包含所有數據的單個節點中。

因此,例如,我的數據結構如下所示:

<root>
    <item>
        <child index="0">
            <data>fooA</data>
            <data>fooB</data>
            <data>fooC</data>
            <data>fooD</data>
        </child>
        <child index="1">
            <data>foo1</data>
            <data>foo2</data>
            <data>foo3</data>
            <data>foo4</data>
        </child>
    </item>
    <item>
        <child index="0">
            <data>barE</data>
            <data>barF</data>
            <data>barG</data>
            <data>barH</data>
        </child>
        <child index="1">
            <data>bar5</data>
            <data>bar6</data>
            <data>bar7</data>
            <data>bar8</data>
        </child>
    </item>
</root>

我想像這樣轉換它:

<root>
    <item>
        <child index="0">
            <data>fooA</data>
            <data>fooB</data>
            <data>fooC</data>
            <data>fooD</data>
            <data>barE</data>
            <data>barF</data>
            <data>barG</data>
            <data>barH</data>
        </child>
        <child index="1">
            <data>foo1</data>
            <data>foo2</data>
            <data>foo3</data>
            <data>foo4</data>
            <data>bar5</data>
            <data>bar6</data>
            <data>bar7</data>
            <data>bar8</data>
        </child>
    </item>
</root>

因此,我認為我需要以某種方式對索引進行分組,然后僅選擇每個元素,但是我不確定如何做到這一點。

提前致謝...

這可能有效,或者至少讓您開始:

<xsl:for-each select="//item[1]/child">
    <xsl:element name="child">
        <xsl:attribute name="index"><xsl:value-of select="@index" /></xsl:attribute>
        <xsl:for-each select="//item/child[@index=@index]/*">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:element>
</xsl:for-each>

但是,一般而言,XSL並非最適合參數化操作。 如果interal for不起作用,您還可以嘗試使用param運行xsl:call-template

還要注意, xsl:copy不能與太多的XSL引擎一起很好地工作,因此您可能需要使用其他東西(例如,使用apply-templates和為元素編寫模板)。

我最終使用了Muenchian分組 ,對我來說效果很好。

Muenchian分組的示例...

XML輸入

<root>
    <item>
        <child index="0">
            <data>fooA</data>
            <data>fooB</data>
            <data>fooC</data>
            <data>fooD</data>
        </child>
        <child index="1">
            <data>foo1</data>
            <data>foo2</data>
            <data>foo3</data>
            <data>foo4</data>
        </child>
    </item>
    <item>
        <child index="0">
            <data>barE</data>
            <data>barF</data>
            <data>barG</data>
            <data>barH</data>
        </child>
        <child index="1">
            <data>bar5</data>
            <data>bar6</data>
            <data>bar7</data>
            <data>bar8</data>
        </child>
    </item>
</root>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="childByIndex" match="child" use="@index"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/root">
    <root>
      <item>
        <xsl:for-each select="item/child[count(.|key('childByIndex',@index)[1])=1]">
          <child>
            <xsl:apply-templates select="@*|key('childByIndex',@index)/*"/>
          </child>
        </xsl:for-each>
      </item>
    </root>
  </xsl:template>

</xsl:stylesheet>

XML輸出

<root>
   <item>
      <child index="0">
         <data>fooA</data>
         <data>fooB</data>
         <data>fooC</data>
         <data>fooD</data>
         <data>barE</data>
         <data>barF</data>
         <data>barG</data>
         <data>barH</data>
      </child>
      <child index="1">
         <data>foo1</data>
         <data>foo2</data>
         <data>foo3</data>
         <data>foo4</data>
         <data>bar5</data>
         <data>bar6</data>
         <data>bar7</data>
         <data>bar8</data>
      </child>
   </item>
</root>

工作實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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