1

私は 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>

したがって、何らかの方法でインデックスでグループ化し、各要素を選択する必要があると思いますが、その方法がよくわかりません。

前もって感謝します...

4

3 に答える 3

2

これは機能するか、少なくとも開始する可能性があります。

<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、要素のテンプレートを使用して作成するなど)。

于 2013-04-15T20:04:33.180 に答える
0

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>

XSLT1.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>

Working Example

于 2016-01-26T19:23:10.730 に答える