0

私は XSLT 1.0 を使用しており、関係者などの xml ドキュメントを家族に分割しようとしています。家族の定義は、一方の親とその子供です。

したがって、この:

<person name =”A”&gt;
   <person name =”B”&gt;
      <person name =”D” />
      <person name =”E” />
   </person>
   <person name=”C”&gt;
      <person name =”F” />
      <person name =”G” />
      <person name =”H” />
   </person>
</person>

結果は次のとおりです。

<family id =”1”&gt;
   <person name =”A”&gt;
      <person name =”B”/>
      <person name=”C”/>
   </person>
</family>

<family id =”2”&gt;
   <person name =”B”&gt;
      <person name =”D” />
      <person name =”E” />
   </person>
</family>


<family id =”3”&gt;
   <person name=”C”&gt;
      <person name =”F”/>
      <person name =”G”/>
      <person name =”H”/>
   </person>
</family>

これを簡単な方法で行うにはどうすればよいですか?

4

1 に答える 1

0

1 つの方法は、他のperson要素を子として持つすべてのperson要素を最初に探すことです。

<xsl:apply-templates select="//person[person]"/>

次に、そのようなperson要素ごとに、要素とその直接の子のみをコピーします。

 <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates select="person" mode="child"/>
 </xsl:copy>

また、家族IDを取得するには、先行するすべてのの要素と祖先を数えることができます

<family id="{count(preceding::person[person]) + count(ancestor-or-self::person)}">

「子」テンプレートは人物とその属性をコピーするだけで、子はコピーしません。

ここに完全な XSLT があります

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

   <xsl:template match="/">
       <families>
          <xsl:apply-templates select="//person[person]"/>
       </families>
   </xsl:template>

   <xsl:template match="person[person]">
      <family id="{count(preceding::person[person]) + count(ancestor-or-self::person)}">
         <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="person" mode="child"/>
         </xsl:copy>
      </family>
   </xsl:template>

   <xsl:template match="person" mode="child">
      <xsl:copy>
         <xsl:copy-of select="@*"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

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

<families>
   <family id="1">
      <person name="A">
         <person>B</person>
         <person>C</person>
      </person>
   </family>
   <family id="2">
      <person name="B">
         <person>D</person>
         <person>E</person>
      </person>
   </family>
   <family id="3">
      <person name="C">
         <person>F</person>
         <person>G</person>
         <person>H</person>
      </person>
   </family>
</families>
于 2012-08-13T08:03:00.287 に答える