我的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。我不能硬编码任何值,因为值非常动态。
答案 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
元素。