0

XMLファイルからいくつかのタグをグループ化するのに問題があります。タグnrの後に要素をグループ化して、新しいタグmasiniに配置したいと思います。入力時にこのXMLがあります:

   <nota>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
<auto>
<nr> 12 </nr>
<bmw>2041</bmw>
<mercedes> masina tdadsa</mercedes>
<dacia> masina veche</dacia>
</auto>

<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
</nota>

取得したい:

    <nota>
<masini>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
<auto>
<nr> 1 </nr>
<bmw>masina tare</bmw>
<mercedes> masina tiganeasca</mercedes>
<dacia> masina romaneasca</dacia>
</auto>
</masini>
<masini>
<auto>
<nr> 12 </nr>
<bmw>2041</bmw>
<mercedes> masina tdadsa</mercedes>
<dacia> masina veche</dacia>
</auto>
</masini>
</nota>

2つのnrが等しい場合、同じmasiniタグに要素を持つ2つのautoタグが必要です。英語でごめんなさい、よろしくお願いします。

4

1 に答える 1

1

XSLT1.0では、最も効率的な手法はMuenchianGroupingと呼ばれます。

まず、グループ内のアイテムを検索するために使用されるxsl:keyを定義します。この場合、 nrelementvalueという名前のauto要素を探しています。

<xsl:key name="auto" match="auto" use="nr" />

次に、グループの最初の要素であるauto要素を探す必要があります(つまり、それぞれの個別のnr要素の最初の出現が含まれています*

<xsl:apply-templates 
   select="auto[generate-id() = generate-id(key('auto', nr)[1])]" mode="group" />

次に、そのような「個別の」要素ごとに、テンプレートを一致させて、グループ内のすべての要素を新しい要素内に配置できます。

<xsl:template match="auto" mode="group">
   <masini>
      <xsl:apply-templates select="key('auto', nr)" />
   </masini>
</xsl:template>

これが完全なXSLTです

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="auto" match="auto" use="nr" />

   <xsl:template match="/*">
      <xsl:copy>
         <xsl:apply-templates select="auto[generate-id() = generate-id(key('auto', nr)[1])]" mode="group" />
      </xsl:copy>
   </xsl:template>

   <xsl:template match="auto" mode="group">
      <masini>
         <xsl:apply-templates select="key('auto', nr)" />
      </masini>
   </xsl:template>

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

サンプルXMLに適用すると、次のように出力されます。

<nota>
   <masini>
      <auto>
         <nr> 1 </nr>
         <bmw>masina tare</bmw>
         <mercedes> masina tiganeasca</mercedes>
         <dacia> masina romaneasca</dacia>
      </auto>
      <auto>
         <nr> 1 </nr>
         <bmw>masina tare</bmw>
         <mercedes> masina tiganeasca</mercedes>
         <dacia> masina romaneasca</dacia>
      </auto>
   </masini>
   <masini>
      <auto>
         <nr> 12 </nr>
         <bmw>2041</bmw>
         <mercedes> masina tdadsa</mercedes>
         <dacia> masina veche</dacia>
      </auto>
   </masini>
</nota>

また、アイデンティティ変換を使用してXML内の既存のすべての要素をコピーすることに注意してください。

于 2012-08-30T09:15:53.710 に答える