如何使用xslt插入/替换元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用xslt插入/替换元素相关的知识,希望对你有一定的参考价值。

我有以下xml文件

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:t="http://www.tibco.com/xmlns/ApplicationManagement"    
name="test">
    <content>
        <on> false </on>
    </content>
</application>

我想让我的xsl修改xml,以便:

如果标签存在同名,则覆盖该值。

如果不存在具有相同值的标记,则将其插入。

这是我的xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:t="http://www.tibco.com/xmlns/ApplicationManagement"
    xmlns="http://www.w3.org/1999/xhtml" version="1.0">
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="content">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:if test="not(status)">
                <status>new status </status>
            </xsl:if>
            <xsl:if test="on">
                <on>new on value</on>
            </xsl:if>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我遇到<on>new on value</on>的问题,因为解决方案应该取代on标签值,而是创建一个全新的

结果如下(没有顶部的xml和应用程序标记):

<content>
    <on> false </on>
    <value> light </value>
    <status xmlns="http://www.w3.org/1999/xhtml">new status 

    </status>
    <on xmlns="http://www.w3.org/1999/xhtml">new on value

    </on>
</content>

如何在同一模板中替换on标签?

答案

您可以使用模板匹配来匹配<on>元素和<status>元素(不是示例的一部分)。

<xsl:template match="content">                  <!-- remove <xsl:if...> from this template -->
    <xsl:copy>
        <xsl:apply-templates />
        <xsl:if test="not(status)">             <!-- if <status> element does not exist, create one -->
            <status>added new status </status>
        </xsl:if>
        <xsl:if test="not(on)">                 <!-- if <on> element does not exist, create one -->
            <on>added new on value</on>
        </xsl:if>
    </xsl:copy>
</xsl:template>

<xsl:template match="on[parent::content]">      <!-- replaces <on> elements with parent <content> -->
    <on>new on value</on>
</xsl:template>

<xsl:template match="status[parent::content]">  <!-- replaces <status> elements with parent <content> -->  
    <status>new status </status>
</xsl:template>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:t="http://www.tibco.com/xmlns/ApplicationManagement" name="test">
    <content>
        <on xmlns="http://www.w3.org/1999/xhtml">new on value</on>        
        <status xmlns="http://www.w3.org/1999/xhtml">added new status </status>
    </content>
</application>

以上是关于如何使用xslt插入/替换元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 替换 XML 节点名称中的字符 - 更改根元素

如何使用 XSLT v1.0 而不是使用 XSLT v2.0 正则表达式插入文本?

如何修复 XSLT 3.0 地图问题?

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

用XSLT替换xml中的break元素

XSLT 替换可变元素文本