如何使用xslt根据属性值添加新元素

时间:2018-12-11 16:38:20

标签: xslt transformation

我想使用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来更改现有的属性值,但是很难添加node3node4

1 个答案:

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