我有一个平面的xml文档。节点确实包含指示它是父节点还是子节点的信息,并且按子节点跟随其父节点的顺序排列。我需要一个XSLT文件来将输入xml转换为xml文件,其中子节点具有返回其父节点的链接。
输入XML文件:
.iterator
我想将其转换为:
<items>
<item type="a">
<value ID="11111" relation="parent"></value>
</item>
<item type="b">
<value ID="22222" relation="child"></value>
</item>
<item type="b">
<value ID="33333" relation="child"></value>
</item>
<item type="a">
<value ID="44444" relation="parent"></value>
</item>
<item type="b">
<value ID="55555" relation="child"></value>
</item>
<item type="a">
<value ID="66666" relation="parent"></value>
</item>
<item type="a">
<value ID="77777" relation="parent"></value>
</item>
<item type="b">
<value ID="88888" relation="child"></value>
</item>
<item type="b">
<value ID="99999" relation="child"></value>
</item>
<item type="b">
<value ID="00000" relation="child"></value>
</item>
</items>
其中“在此处插入父ID”由子节点父节点ID替换。
这是我当前的xslt文件:
<items>
<item>
<itemType>a</itemType>
<itemID>11111</itemID>
<itemRelationship>parent</itemRelationship>
<itemParentID />
</item>
<item>
<itemType>b</itemType>
<itemID>22222</itemID>
<itemRelationship>child</itemRelationship>
<itemParentID>insert parent ID here</itemParentID>
</item>
<item>
<itemType>b</itemType>
<itemID>33333</itemID>
<itemRelationship>child</itemRelationship>
<itemParentID>insert parent ID here</itemParentID>
</item>
<item>
<itemType>a</itemType>
<itemID>44444</itemID>
<itemRelationship>parent</itemRelationship>
<itemParentID />
</item>
<item>
<itemType>b</itemType>
<itemID>55555</itemID>
<itemRelationship>child</itemRelationship>
<itemParentID>insert parent ID here</itemParentID>
</item>
<item>
<itemType>a</itemType>
<itemID>66666</itemID>
<itemRelationship>parent</itemRelationship>
<itemParentID />
</item>
<item>
<itemType>a</itemType>
<itemID>77777</itemID>
<itemRelationship>parent</itemRelationship>
<itemParentID />
</item>
<item>
<itemType>b</itemType>
<itemID>88888</itemID>
<itemRelationship>child</itemRelationship>
<itemParentID>insert parent ID here</itemParentID>
</item>
<item>
<itemType>b</itemType>
<itemID>99999</itemID>
<itemRelationship>child</itemRelationship>
<itemParentID>insert parent ID here</itemParentID>
</item>
<item>
<itemType>b</itemType>
<itemID>00000</itemID>
<itemRelationship>child</itemRelationship>
<itemParentID>insert parent ID here</itemParentID>
</item>
</items>
答案 0 :(得分:1)
您的父ID所需的表达式是....
<xsl:value-of select="$pCurrentItem/preceding-sibling::item[@type='a'][1]/value/@ID" />
但是,您可以考虑将XSLT简化为此,以避免重复代码....
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="item">
<item>
<itemType>
<xsl:value-of select="@type"/>
</itemType>
<itemID>
<xsl:value-of select="value/@ID"/>
</itemID>
<itemRelationship>
<xsl:value-of select="value/@relation"/>
</itemRelationship>
<itemParentID>
<xsl:if test="@type='b'">
<xsl:value-of select="preceding-sibling::item[@type='a'][1]/value/@ID" />
</xsl:if>
</itemParentID>
</item>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>