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协同工作。
感谢。
答案 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
元素的模板。