使用xsl创建新节点和元素xml

时间:2018-04-13 05:37:32

标签: html xls

我需要一个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>

感谢您的帮助。

1 个答案:

答案 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 - 虽然因为我不想声明新的命名空间。