【问题标题】:How to add new elements based on attribute values using xslt如何使用 xslt 基于属性值添加新元素
【发布时间】:2018-12-11 16:38:20
【问题描述】:

我想使用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 有困难。

【问题讨论】:

    标签: xslt transformation


    【解决方案1】:

    看起来相当琐碎:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多