我正在尝试将具有树结构的XML转换为平面列表。这是我想要转换的输入XML的一小部分:
<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标记,该标记随类别计数递增。
你能告诉我吗?答案 0 :(得分: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>