0

XML ドキュメントで同じノードの子をグループ化 (マージ) する必要があります。サンプルコードを入手した同様のトピックを見つけましたが、私の XML はより複雑でねじれているため、次の XSL コードの構文のロジックを完全に理解する必要があります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" />
  <xsl:template match="/">
    <Groups>
      <!--
      Iterate over a node set containing just one GroupData element for
      each combination of ID and Key
      -->
      <xsl:for-each select="/Groups/GroupData[count( . | key('group-data', concat(@ID, '___', @Key))[1]) = 1]">
        <GroupData>
          <!-- Copy attributes from the "prototype" GroupData -->
          <xsl:copy-of select="@*"/>
          <!--
          Copy ItemData children from *all* GroupData elements with matching
          ID/Key
          -->
          <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" />
        </GroupData>
      </xsl:for-each>
    </Groups>
  </xsl:template>
</xsl:stylesheet>

そのXSL のサンプルXML コードは次のとおりです。

<GroupData ID="xxx" Key="4" Temp="yyy">
        <ItemData ID="zzz" Value="3"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="abc" Value="3"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="pqr" Value="1982"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="tuv" Value="1982"/>
    </GroupData>

XSLコードを理解して、自分のケースに適用できるようにしたいと思います。

誰かが私のためにそれを詳しく説明できますか? より正確には、これらの部分:

<xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" />

<xsl:for-each select="/Groups/GroupData[count( . | key('group-data', concat(@ID, '___', @Key))[1]) = 1]">
        <GroupData>
          <!-- Copy attributes from the "prototype" GroupData -->
          <xsl:copy-of select="@*"/>
          <!--
          Copy ItemData children from *all* GroupData elements with matching
          ID/Key
          -->
          <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" />
        </GroupData>
      </xsl:for-each>
4

1 に答える 1

0

<xsl:key name=""/>指定された式を検索キーとして使用して、ドキュメント内に XML ノードのインデックスを作成します。これは、同様のノードを見つけやすくするためです。XSL 1.x では、これがノードをグループ化する主な手段です。key(name, key)このインデックスのクエリに使用されます。

あなたの場合

/Groups/GroupData[count( . | key('group-data', concat(@ID, '___', @Key))[1]) = 1]

GroupData基本的には、指定されたキーのインデックスで最初に来るすべてのノードを検索します。これは、次のように書くこともできます。

/Groups/GroupData[generate-id() = generate-id(key('group-data', concat(@ID, '___', @Key))[1])]

このgenerate-id()メソッドは、ドキュメント内の任意のノードに一意の ID を作成します。ノードが等しいかどうかを比較することができます。引数が指定されていない場合は、アクティブ ノード ( .)が使用されます。

于 2013-05-17T14:46:01.010 に答える