XSLT Qn:如果标签不存在,如何在XML中添加标签?

时间:2016-08-04 08:43:34

标签: xml xslt

xlst世界的新手,尝试在xml文件中进行简单更新。

我想在我的XML文件中添加两个不同的标记<NODE1 name="name1" value="value1"/><NODE2 name="name2" value="value2"/>,只要它们分别不在MAIN_NODE中。

E.g。如果MAIN_NODE中不存在NODE1,则应在内部插入NODE1。如果NODE2不存在,则应添加NODE2。如果两者都不存在,则应添加两者,反之亦然。

我尝试了以下代码:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >  
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/"> 
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:template>  
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="MAIN_NODE">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:text>
            </xsl:text>
            <NODE1 name="name1" value="value1"/>
        </xsl:copy>
    </xsl:template>         
</xsl:stylesheet>

它正在工作但是当我随后运行XSLT时,NODE1会重复添加。我怎样才能在这段代码中加入条件?然后对Node2重复同样的事情,这样两者都可以通过单个XSLT协同工作。

感谢。

2 个答案:

答案 0 :(得分:1)

就像这样 -

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >  
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/"> 
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:template>  
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="MAIN_NODE">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:if test="not(./NODE1)">
                <NODE1 name="name1" value="value1"/>
            </xsl:if>
            <xsl:if test="not(./NODE2)">
                <NODE2>Node2_string</NODE2>
            </xsl:if>                                      
        </xsl:copy>            
    </xsl:template>         
</xsl:stylesheet>

谢谢, 拉吉夫

答案 1 :(得分:0)

<xsl:template match="MAIN_NODE">更改为<xsl:template match="MAIN_NODE[not(NODE1)]">,仅使用不具有MAIN_NODE子元素的NODE1元素的模板。