2013-09-27 30 views
0

我試圖轉換XML:XSLT轉換XML xmlns的包括

<servicioSDD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" facade="GestionEstadosSolicitudEspecifico" xmlns="http://new.webservice.namespace"> 
    <entrada xmlns=""> 
     <IdSubscription>7daa07b5-348c-463b-ab09-d6fb0e25dc53</IdSubscription> 
     <BusinessProcessCode>Expediente Digital</BusinessProcessCode> 
    <ParamResponses> 
      <ParamResponse> 
       <Name>TIPODOCUMENTO</Name> 
       <ValParam>DOCGEN_PO_ED</ValParam> 
      </ParamResponse> 
     <ParamResponse> 
       <Name>GN_ID</Name> 
       <ValParam>KFX001_2105</ValParam> 
      </ParamResponse> 
     <ParamResponse> 
       <Name>NUM_PERSONA_CLI</Name> 
        <ValParam>F8469</ValParam> 
      <ValParam>F8470</ValParam> 
        <ValParam>F8471</ValParam> 
      </ParamResponse> 
     <ParamResponse> 
       <Name>GN_VALIDITYDATE</Name> 
       <ValParam>9999-12-31</ValParam> 
      </ParamResponse> 
      <ParamResponse> 
       <Name>CONT_PARTENON</Name> 
       <ValParam>00490075442115807771</ValParam> 
      </ParamResponse> 
     <ParamResponse> 
       <Name>ID_SOLICITUD</Name> 
       <ValParam>00490075000003590200001</ValParam> 
      </ParamResponse> 
     <ParamResponse> 
       <Name>GN_CREATIONDATE</Name> 
       <ValParam>2013-5-21</ValParam> 
      </ParamResponse> 
     </ParamResponses> 
    </entrada> 
</servicioSDD> 

與XSLT:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
exclude-result-prefixes='' 


> 
<xsl:template match="/"> 
<entrada > 
     <xsl:for-each select="servicioSDD/entrada/ParamResponses/ParamResponse"> 
      <xsl:if test="Name='TIPODOCUMENTO'"> 
       <TIPODOCUMENTO><xsl:value-of select="ValParam"/></TIPODOCUMENTO> 
      </xsl:if> 
      <xsl:if test="Name='GN_ID'"> 
       <GN_ID><xsl:value-of select="ValParam"/></GN_ID> 
      </xsl:if> 
      <xsl:if test="Name='CONT_PARTENON'"> 
        <xsl:variable name="contrato" select="ValParam"/> 
       <CONT_PARTENON> 
        <CENTRO> 
         <EMPRESA><xsl:value-of select="substring($contrato,1,4)"/></EMPRESA> 
         <CENTRO><xsl:value-of select="substring($contrato,5,4)"/></CENTRO> 
        </CENTRO> 
        <PRODUCTO><xsl:value-of select="substring($contrato,9,3)"/></PRODUCTO> 
        <NUMERO_DE_CONTRATO><xsl:value-of select="substring($contrato,12,7)"/></NUMERO_DE_CONTRATO> 
       </CONT_PARTENON> 
      </xsl:if> 
      <xsl:if test="Name='ID_SOLICITUD'"> 
       <xsl:variable name="solicitud" select="ValParam"/> 
       <ID_SOLICITUD> 
        <CODIGO_DE_SOLICITUD><xsl:value-of select="substring($solicitud,21)"/></CODIGO_DE_SOLICITUD> 
        <ID_CASO_PN> 
         <CODIGO_DE_CASO><xsl:value-of select="substring($solicitud,9,10)"/></CODIGO_DE_CASO> 
         <CENTRO> 
          <EMPRESA><xsl:value-of select="substring($solicitud,1,4)"/></EMPRESA> 
          <CENTRO><xsl:value-of select="substring($solicitud,5,4)"/></CENTRO> 
         </CENTRO> 
         <VERSION><xsl:value-of select="substring($solicitud,19,2)"/></VERSION> 
        </ID_CASO_PN> 
       </ID_SOLICITUD> 
      </xsl:if> 
      <xsl:if test="Name='GN_CREATIONDATE'"> 
       <xsl:variable name="Cdate" select="ValParam"/> 
       <GN_CREATIONDATE><xsl:value-of select="concat(substring($Cdate,9,2),concat(concat('-',substring($Cdate,6,2)), concat('-',substring($Cdate,1,4))))"/></GN_CREATIONDATE> 
      </xsl:if> 
      <xsl:if test="Name='GN_VALIDITYDATE'"> 
       <xsl:variable name="Vdate" select="ValParam"/> 
       <GN_VALIDITYDATE><xsl:value-of select="concat(substring($Vdate,9,2),concat(concat('-',substring($Vdate,6,2)), concat('-',substring($Vdate,1,4))))"/></GN_VALIDITYDATE> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:for-each select="servicioSDD/entrada/ParamResponses/ParamResponse[Name='NUM_PERSONA_CLI']"> 
      <listaPersonaCliente> 
       <xsl:for-each select="ValParam"> 
        <NUM_PERSONA_CLI> 
         <xsl:variable name='cliente' select="."/> 
         <CODIGO_DE_PERSONA><xsl:value-of select="substring($cliente,2)"/></CODIGO_DE_PERSONA> 
         <TIPO_DE_PERSONA><xsl:value-of select="substring($cliente,1,1)"/></TIPO_DE_PERSONA> 
        </NUM_PERSONA_CLI> 
       </xsl:for-each> 
      </listaPersonaCliente> 
    </xsl:for-each> 
</entrada> 
</xsl:template> 
</xsl:stylesheet> 

結果我得到的是:

<?xml version="1.0" encoding="UTF-8"?><entrada/> 

如果我刪除了xml:轉換完成沒有問題,但我無法控制xml格式的到達爲我的服務

非常感謝你

回答

0

的問題是你的XML根元素servicioSDD屬於一個命名空間內

<servicioSDD ... xmlns="http://new.webservice.namespace"> 

然而,在你的XSLT,你這樣做

<xsl:for-each select="servicioSDD/entrada/ParamResponses/ParamResponse"> 

這意味着它正在尋找一個不在任何名稱空間中的servicioSDD元素,因此它不會匹配XML中的一個,它位於命名空間中。

你可以做什麼,是改變XSLT聲明命名空間,如下所示:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:sdd="http://new.webservice.namespace" 
exclude-result-prefixes='sdd'> 

然後你可以改變的xsl:for-每個環路如下

<xsl:for-each select="sdd:servicioSDD/entrada/ParamResponses/ParamResponse"> 

在這種情況下,您只需將名稱空間前綴添加到servicioSDD元素中,因爲它下面的所有元素都不在名稱空間中,因此相匹配。或者,如果不想在XSLT中定義一個名稱空間(也許它可能因XML而異),那麼您可以將xsl:for-each更改爲此,這將匹配所有的根元素

<xsl:for-each select="*/entrada/ParamResponses/ParamResponse"> 

或者,如果仍想檢查這是一個servicioSDD元素,你可以添加一個條件

<xsl:for-each select="*[local-name()='servicioSDD']/entrada/ParamResponses/ParamResponse">