使用XSLT将XML转换为另一个Xml

时间:2014-10-21 18:50:59

标签: xml xslt

我的xml如下:

<items>
    <item id='10' name='item1'/>
    <item id='20' name='item2'/>
    <item id='30' name='item3'/>
     <item id='40' name='item4'/>
    </items>

    <parent_group>
    <parent_group_item item_id='10' parent_group_id='30'/>
    <parent_group_item item_id='20' parent_group_id='30'/>
    </parent_group>

我想使用xsl:

将上面的代码段转换为以下格式

  <items>
    <item>
    <id>10</id>
    <name>    item1    </name>
    <parent_group_id>30</parent_group_id>
    </item>
    <item>
    <id>20</id>
    <name>    item2    </name>
    <parent_group_id>30</parent_group_id>
    </item>
    <item>
    <id>30</id>
    <name>    item3    </name>
   
    </item>
    <item>
    <id>40</id>
    <name>    item4   </name>
   
    </item>
    </items>

你可以帮助我只需要使用xslt。我不能硬编码任何值,因为值非常动态。

1 个答案:

答案 0 :(得分:1)

假设你的输入Xml看起来如此(即有一个根元素):

<xml>
    <items>
    <item id='10' name='item1'/>
    <item id='20' name='item2'/>
    <item id='30' name='itemParent'/>
    </items>

    <parent_group>
    <parent_group_item item_id='10' parent_group_id='30'/>
    <parent_group_item item_id='20' parent_group_id='30'/>
    </parent_group>
</xml>

然后,您可以使用key查找parent_group_item元素中的item_ids

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

    <xsl:key name="parentGroup" match="parent_group_item" use="@item_id" />

    <xsl:template match="xml/items">
        <items>
            <xsl:apply-templates select="item"></xsl:apply-templates>
        </items>
    </xsl:template>

    <xsl:template match="item">
        <item>
            <id>
                <xsl:value-of select="@id"/>
            </id>
            <name>
                <xsl:value-of select="@name"/>
            </name>
        <xsl:variable name="parentGroupKey" select="key('parentGroup', @id)" />
        <xsl:if test="$parentGroupKey">
            <parent_group_id>
                <xsl:value-of select="key('parentGroup', @id)/@parent_group_id"/>
            </parent_group_id>
        </xsl:if>
        </item>
    </xsl:template>
</xsl:stylesheet>

如果不匹配,则更新为省略parent_group_id元素。