2

既に書いたコードを使用して解決策を推測する方法を理解しようとしています。

簡単にするために、最初にやりたいこととこれまでに得たものを説明します。

同じ title 属性を持ついくつかのノードを含む XML 変数が XSLT にあるとします。

@Dimitre Novatchev ソリューションを使用して、それらを 1 つのノードに結合することができました。

だから私が持っていたら:

<t>
    <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="xxx" Key="4" Temp="yyy">
        <ItemData ID="www" Value="1982"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="def" Value="1982"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="tuv" Value="1982"/>
    </GroupData>
</t>

次のキーを使用した後

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID, '+', @Key)"/>

私は得るでしょう:

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

ここで、これを少し変更したいと思います。私の決定により、タイトルをマージ/結合できるようにしたいと思います。上記の例では、xxx と zzz は異なるタイトルを使用していますが、同じグループに属するように定義したいと考えています (極端なケース - 私のワークスペースではそれらを同一に定義しました - 次のようなケースがもっとあるかもしれません)。これ)。

一般的にどのような方向にすべきか教えていただければ幸いです(キーを変更するか、別の方法(generate-idなど)を使用する必要があると思います)。

多くの不必要な労力を必要とする悪いソリューションだけを実装していることに気づきました。

4

1 に答える 1

0

これは XSLT1 だと思いますが、XSLT2 の方が見栄えがするので残念ですが、基本的には、グループ化したいノードが同じキーになるようにする必要があります。

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID, '+', @Key)"/>

@ID と @key が同じである場合にのみ、同じ use 属性が取得されます。

それを次のように変更すると

<xsl:key name="kGDByIdKey" match="GroupData[not(@ID='xxx')]" use="concat(@ID, '+', @Key)"/>
<xsl:key name="kGDByIdKey" match="GroupData[@ID='xxx'] use="concat('zzz', '+', @Key)"/>

次に、IDxxxを持つノードにインデックスが付けられます(したがって、グループ化されます)zzz(または、ノードからルックアップ値を作成するときに同様の変更を行う必要があります)

xslt 2 を使用していた場合は、そのような複数の変更に拡張された場合におそらく扱いにくい、より単純な関数型スタイルを使用できます。

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(replace(@ID,'^xxx$','zzz'), '+', @Key)"/>
于 2013-01-03T02:24:36.090 に答える