2016-04-15 2 views
0

Я пытаюсь преобразовать XML с древовидной структурой в плоский список. Это небольшая часть входного 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> 

Я понятия не имею, как это сделать. Первая проблема заключается в изменении древовидной структуры на плоский список, а вторая проблема - добавление тега 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

Это работает, но есть одна проблема. Родительская категория всегда является идентификатором первой категории в списке. Если категория «Шоки» перед Форками, то все подкатегории «Форкс» имеют parent_category = 13 вместо 12. – sajushko

+0

Так что, похоже, я это понял. Я использовал в категории ancestor :: category вместо ../../category и ancestor :: category/id в значении. Похоже, теперь он работает, как мне нужно. Thx много для помощи Мартин. – sajushko

+0

@sajushko, извините за проблему, у меня был неправильный XPath там, теперь исправлен, хотя вы также нашли исправление самостоятельно. –

Смежные вопросы