寻求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
相关产品推荐
相关产品推荐

