我想使用xslt
来转换此xml
输入,
<node1 name="n1">
<node2 name="n2_X1" transform="keep_me"/>
<node2 name="n2_X2" transform="change_key1"/>
<node2 name="n2_X3" transform="change_key2"/>
<node2 name="n2_X4" transform="keep_me"/>
</node1>
到看起来像这样的输出xml
,
<node1 name="n1">
<node2 name="n2_X1" transform="keep_me"/>
<node2 name="n2_X2" transform="change_key1"/>
<node2 name="n2_X3" transform="change_key2"/>
<node2 name="n2_X4" transform="keep_me"/>
<node3 type="join_tables">
<node4 name="new_name1_corresponding_to_change_key1"/>
<node4 name="new_name2_corresponding_to_change_key2"/>
</node3>
</node1>
基本上,如果我的xlst
代码看到transform="change_key1"
,我希望它创建一个名为node3
的新节点(如果尚未创建),并添加一个属性type="join_tables"
,然后创建一个新节点node4
,并添加一个属性name="new_name1_corresponding_to_change_key1"
。
我可以使用xslt
来更改现有的属性值,但是很难添加node3
和node4
。
答案 0 :(得分:0)
似乎微不足道:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="node1">
<xsl:copy>
<xsl:copy-of select="@*|*"/>
<xsl:variable name="join_tables" select="node2[starts-with(@transform, 'change_key')]" />
<xsl:if test="$join_tables">
<node3 type="join_tables">
<xsl:for-each select="$join_tables">
<node4 name="new_name{position()}_corresponding_to_{@transform}"/>
</xsl:for-each>
</node3>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>