我需要一个XSL解决方案来用新节点替换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>
<numeroRadicadoCaso>test</numeroRadicadoCaso>
<nombreEvento>test2</nombreEvento>
<informacionRelacionada>test3</informacionRelacionada>
</informacionEventoCasoBPM>
</ns0:MT_AvanzarEventoIdCase2_Req_Out>
我需要转换到这个结构:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:per="http://www.colpensiones.gov.co/contracts/1.0/personas"
xmlns:per1="http://www.colpensiones.gov.co/schemas/1.0/personas"
xmlns:com="http://www.colpensiones.gov.co/contracts/1.0/comun"
xmlns:com1="http://www.colpensiones.gov.co/schemas/1.0/comun">
<soapenv:Header>
<per:Configuracion>
<per1:tipoSistemaExterno>?</per1:tipoSistemaExterno>
<per1:tipoProcesamiento>?</per1:tipoProcesamiento>
<per1:idCorrelacion>?</per1:idCorrelacion>
</per:Configuracion>
</soapenv:Header>
<soapenv:Body>
<com:InformacionEventoCasoBPM>
<com1:numeroRadicadoCaso>?</com1:numeroRadicadoCaso>
<com1:nombreEvento>?</com1:nombreEvento>
<com1:informacionRelacionada>?</com1:informacionRelacionada>
</com:InformacionEventoCasoBPM>
</soapenv:Body>
</soapenv:Envelope>
我已经尝试了一周但我不能,这是我的结构,但它不起作用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:per="http://www.colpensiones.gov.co/contracts/1.0/personas"
xmlns:per1="http://www.colpensiones.gov.co/schemas/1.0/personas"
xmlns:com="http://www.colpensiones.gov.co/contracts/1.0/comun"
xmlns:com1="http://www.colpensiones.gov.co/schemas/1.0/comun"
exclude-result-prefixes="soapenv per per1 com com1">
<xsl:template match = "/">
<soapenv:envelope>
<soapenv:header>
<per:Configuracion>
<per1:tipoSistemaExterno><xsl:value-of select = "tipoSistemaExterno"/></per1:tipoSistemaExterno>
<per1:tipoProcesamiento><xsl:value-of select = "tipoProcesamiento"/></per1:tipoProcesamiento>
<per1:idCorrelacion><xsl:value-of select = "idCorrelacion"/></per1:idCorrelacion>
</per:Configuracion>
</soapenv:header>
<soapenv:body>
<com:InformacionEventoCasoBPM>
<com1:numeroRadicadoCaso><xsl:value-of select = "numeroRadicadoCaso"/></com1:numeroRadicadoCaso>
<com1:nombreEvento><xsl:value-of select = "nombreEvento"/></com1:nombreEvento>
<com1:informacionRelacionada><xsl:value-of select = "informacionRelacionada"/></com1:informacionRelacionada>
</com:InformacionEventoCasoBPM>
</soapenv:body>
</soapenv:envelope>
</xsl:template>
</xsl:stylesheet>
感谢您的帮助。
答案 0 :(得分:0)
我只是假设你想要那个输出。代码将是:
<xsl:template match="/">
<xsl:element name="soapenv-Envelope">
<xsl:element name="soapenv-Header">
<xsl:apply-templates select="//configuracion"/>
</xsl:element>
<xsl:element name="soapenv-Body">
<xsl:apply-templates select="//informacionEventoCasoBPM"/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="configuracion">
<xsl:element name="per-Configuration">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*[ancestor::configuracion]">
<xsl:element name="{concat('per1-', local-name())}">
<!-- copy the text within the node -->
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="informacionEventoCasoBPM">
<xsl:element name="com-InformacionEventoCasoBPM">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*[ancestor::informacionEventoCasoBPM]">
<xsl:element name="{concat('com1-', local-name())}">
<!-- copy the text within the node -->
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
我替换了:with - 虽然因为我不想声明新的命名空间。