You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求XSL解决方案:创建XML新节点及替换现有节点

XSL解决方案:创建与替换XML节点/元素

嘿,我来帮你搞定这个XSL处理的需求!针对你给出的XML结构,我整理了一套实用的解决方案,既能创建新节点/元素,也能替换现有节点,咱们一步步来看:

原始XML结构

首先先确认下你提供的原始XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:MT_AvanzarEventoIdCase2_Req_Out xmlns:ns0="http://colpensiones.gov.co/AvanzarEventoIdCase2">
    <configuracion>
        <tipoSistemaExterno>test4</tipoSistemaExterno>
        <tipoProcesamiento>test5</tipoProcesamiento>
        <idCorrelacion>test6</idCorrelacion>
    </configuracion>
    <informacionEventoCasoBPM>...</informacionEventoCasoBPM>
</ns0:MT_AvanzarEventoIdCase2_Req_Out>

XSLT解决方案代码

下面是实现需求的XSLT代码,包含了替换节点内容、替换整个节点、创建新节点三种常用场景:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://colpensiones.gov.co/AvanzarEventoIdCase2">
    <!-- 基础模板:原样复制所有未被匹配的节点/属性,保证原有结构大部分不变 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 场景1:替换指定节点的内容 -->
    <xsl:template match="configuracion/tipoSistemaExterno">
        <tipoSistemaExterno>new_test_system</tipoSistemaExterno>
    </xsl:template>

    <!-- 场景2:替换整个节点(换成全新的结构) -->
    <xsl:template match="configuracion/tipoProcesamiento">
        <nuevoTipoProcesamiento>
            <categoria>batch</categoria>
            <subTipo>priority</subTipo>
        </nuevoTipoProcesamiento>
    </xsl:template>

    <!-- 场景3:在指定节点下新增一个新元素 -->
    <xsl:template match="configuracion">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <!-- 新增的日期节点,XSLT 2.0可用current-date(),1.0可替换为固定值 -->
            <fechaProcesamiento><xsl:value-of select="current-date()"/></fechaProcesamiento>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

代码逻辑解释

  • 基础复制模板:这是XSLT里的核心默认规则,它会自动复制所有没有被其他模板匹配到的节点和属性,这样就不用手动写代码复制整个XML结构,只需要处理你需要修改的部分就行。
  • 替换节点内容:当匹配到<configuracion>下的<tipoSistemaExterno>时,直接输出一个同名但内容为new_test_system的节点,相当于替换了原有内容。
  • 替换整个节点:匹配到<tipoProcesamiento>时,直接输出一个全新的<nuevoTipoProcesamiento>节点及其子元素,完全替换掉原来的节点。
  • 创建新节点:匹配到<configuracion>节点时,先复制它的所有原有内容,然后追加一个<fechaProcesamiento>节点,这里用current-date()获取当前日期(如果用XSLT 1.0的话,可以改成固定值比如<fechaProcesamiento>2024-05-20</fechaProcesamiento>)。

转换后的XML效果

用上面的XSLT处理后,你会得到这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:MT_AvanzarEventoIdCase2_Req_Out xmlns:ns0="http://colpensiones.gov.co/AvanzarEventoIdCase2">
    <configuracion>
        <tipoSistemaExterno>new_test_system</tipoSistemaExterno>
        <nuevoTipoProcesamiento>
            <categoria>batch</categoria>
            <subTipo>priority</subTipo>
        </nuevoTipoProcesamiento>
        <idCorrelacion>test6</idCorrelacion>
        <fechaProcesamiento>2024-05-20</fechaProcesamiento>
    </configuracion>
    <informacionEventoCasoBPM>...</informacionEventoCasoBPM>
</ns0:MT_AvanzarEventoIdCase2_Req_Out>

额外实用小技巧

  • 命名空间注意事项:一定要在XSLT里声明和原始XML一致的命名空间(比如示例里的xmlns:ns0="http://colpensiones.gov.co/AvanzarEventoIdCase2"),否则节点匹配会失败。
  • 动态替换逻辑:如果需要根据原有节点的值动态替换,可以用<xsl:choose>做判断,比如:
    <xsl:template match="configuracion/tipoSistemaExterno">
        <tipoSistemaExterno>
            <xsl:choose>
                <xsl:when select=".='test4'">production_system</xsl:when>
                <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
            </xsl:choose>
        </tipoSistemaExterno>
    </xsl:template>
    
  • 处理深层节点:如果<informacionEventoCasoBPM>里的内容也需要修改,只需要新增对应的匹配模板即可,基础复制模板会自动处理其他未匹配的部分。

内容的提问来源于stack exchange,提问作者Oscar Florez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:15