2011-01-25 13 views
6

Estoy tratando de transformar una cadena con datos xml (respuesta de un servicio web). Traté de empezar de forma sencilla simplemente reciben el nombre de:Obtener "prefijo 'jabón' no está definido" en el archivo xslt

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
     <table> 
     <tr> 
      <th>Name</th> 
     </tr> 
     <xsl:for-each select="soap:Envelope/soap:Body/ABRSearchByABNResponse/ABRPayloadSearchResults/response/legalName/"> 
      <tr> 
      <td> 
       <xsl:value-of select="givenName"/> 
      </td>  
      </tr> 
     </xsl:for-each> 

     </table> 
    </xsl:template> 
</xsl:stylesheet> 

Sin embargo, me sale "prefijo 'jabón' no está definido", ¿cómo puedo solucionar esto? Gracias.

+0

Buena pregunta, +1. Vea mi respuesta para una explicación y solución completa. –

Respuesta

5

En XSLT, cualquier prefijo de espacio de nombres utilizado en una expresión XPath se debe definir en una declaración de espacio de nombres correspondiente.

Este no es el caso con su código y de ahí el error.

Solución:

declarar el espacio de nombres de jabón:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:soap="http://soap/envelope/" 
> 
+0

@Alejandro: Sí, tengo un poco de sueño esta mañana. :) –

+0

@Alejandro: Reparado. –

+0

+1 Respuesta correcta. –

0

El prefijo de espacio, soap en su caso, es la abreviatura para el espacio de nombres URI real. Para evitar que tenga http://soap/envelope/ en todas partes, puede definir una vez que soap significa http://soap/envelope/, y use soap en el resto de su documento.

Esto significa que si usa un prefijo de espacio de nombres, tiene que definirse para que se pueda encontrar el espacio de nombres real.

También podría declarar que pizza corresponde a http://soap/envelope/ y usar eso en su lugar. El prefijo de espacio de nombres soap no es especial.

+0

Entonces debería usar y luego ? – peter