2016-04-15 19 views
0

を使用してフラットな構造にツリーデータ構造を持つXMLを変換します。私はこのような出力を必要とするは、私はフラットなリストにツリー構造を持つXMLを変換しようとしていますXSLT

<category_list> 
    <category> 
     <id>12</id> 
     <name>Forks</name> 
     <sub_categories> 
      <category> 
       <id>15</id> 
       <name>26"</name> 
       <sub_categories /> 
      </category> 
      <category> 
       <id>16</id> 
       <name>27,5"</name> 
       <sub_categories /> 
      </category> 
      <category> 
       <id>19</id> 
       <name>27,5+"</name> 
       <sub_categories /> 
      </category> 
      <category> 
       <id>17</id> 
       <name>29"</name> 
       <sub_categories /> 
      </category> 
     </sub_categories> 
    </category> 
    <category> 
     <id>13</id> 
     <name>Shocks</name> 
     <sub_categories /> 
    </category> 
    <category> 
     <id>14</id> 
     <name>Springs</name> 
     <sub_categories /> 
    </category> 
</category_list> 

<categories> 
    <category> 
     <id>12</id> 
     <name>Forks</name> 
     <parent_category>0</parent_category> 
     <order_by>1</order_by> 
    </category> 
    <category> 
     <id>15</id> 
     <name>26"</name> 
     <parent_category>12</parent_category> 
     <order_by>1</order_by> 
    </category> 
    <category> 
     <id>16</id> 
     <name>27,5"</name> 
     <parent_category>12</parent_category> 
     <order_by>2</order_by> 
    </category> 
    <category> 
     <id>19</id> 
     <name>27,5+"</name> 
     <parent_category>12</parent_category> 
     <order_by>3</order_by> 
    </category> 
    <category> 
     <id>17</id> 
     <name>29"</name> 
     <parent_category>12</parent_category> 
     <order_by>4</order_by> 
    </category> 
    <category> 
     <id>13</id> 
     <name>Shocks</name> 
     <parent_category>0</parent_category> 
     <order_by>2</order_by> 
    </category> 
    <category> 
     <id>14</id> 
     <name>Springs</name> 
     <parent_category>0</parent_category> 
     <order_by>3</order_by> 
    </category> 
</categories> 

私はそれを行う方法を見当がつかないこれは私が変換しようとしている入力XMLのごく一部です。最初の問題は、ツリー構造をフラットリストに変更することです.2番目の問題は、カテゴリカウントで増分するorder_byタグを追加することです。

あなたがアドバイスをしてくださいことはできますか?

答えて

1

あなたはすべての//categoryを処理し、その後、position()を使用することができます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="category_list"> 
     <categories> 
      <xsl:apply-templates select="//category"/> 
     </categories> 
    </xsl:template> 

    <xsl:template match="category"> 
     <xsl:copy> 
      <xsl:copy-of select="*[not(self::sub_categories)]"/> 
      <parent_category> 
       <xsl:choose> 
        <xsl:when test="../parent::category"> 
         <xsl:value-of select="../parent::category/id"/> 
        </xsl:when> 
        <xsl:otherwise>0</xsl:otherwise> 
       </xsl:choose> 
      </parent_category> 
      <order_by> 
       <xsl:value-of select="position()"/> 
      </order_by> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

それが動作しているが、1つの問題があります。親カテゴリは、常にリスト内の最初のカテゴリのIDです。カテゴリShockがForksの前にある場合、Forkのすべてのサブカテゴリには12ではなくparent_category = 13があります。 – sajushko

+0

したがって、私はそれを理解するように見えます。 ../../categoryの代わりにancestor :: categoryを使用し、value-ofのancestor :: category/idを使用しました。それが今、私が必要とするように動作するように見えます。 Thxはマーティンのためにたくさんあります。 – sajushko

+0

@ sajushko、問題について申し訳ありませんが、間違ったXPathがありましたが、修正されました。 –

関連する問題