使用XSLT

时间:2016-04-15 11:26:40

标签: xml xslt

我正在尝试将具有树结构的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标记,该标记随类别计数递增。

你能告诉我吗?

1 个答案:

答案 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>