XSL

2011-08-23 15 views
5

Si tengo este XSLXSL

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html"/> 
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:value-of select="//Description" /> 
    </xsl:template> 
</xsl:stylesheet> 

Y este XML

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LookupValue> 
    <Description>AGL</Description> 
    <Value>8</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Australian Power &amp; Gas</Description> 
    <Value>6</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>EnergyAustralia</Description> 
    <Value>13</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Origin Energy</Description> 
    <Value>9</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>TRU Energy</Description> 
    <Value>7</Value> 
    </LookupValue> 
</ArrayOfLookupValue> 

¿Cómo realmente obtener algunos datos de esta línea:

<xsl:value-of select="//Description" /> 

He pasado horas sobre esto y he llegado a la conclusión de que el espacio de nombres xmlns = es lo que me está causando dolor.

Cualquier ayuda muy apreciada.

Por cierto, el XML proviene de un servicio web así que no puedo simplemente "cambiar" - me puedo preproceso, pero eso no es lo ideal ...

También he confirmado que la eliminación de los espacios de nombres de una simulación del XML soluciona el problema.

+0

Buena pregunta, +1. Vea mi respuesta para una explicación y una solución corta y fácil. –

+0

Tiene razón en que el espacio de nombres está marcando la diferencia. Consulte la buena explicación de Dimitre ... y realmente ahorrará tiempo en el futuro si lee espacios de nombres XML (particularmente, como se usa en XPath). – LarsH

Respuesta

12

Esta es la mayoría de las preguntas más frecuentes tanto para XPath como para XSLT.

La respuesta corta es que en XPath se considera que un nombre no prefijado pertenece a "sin espacio de nombres". Sin embargo, en un documento con un espacio de nombre predeterminado, los nombres no prefijados pertenecen al espacio de nombre predeterminado.

Por lo tanto, para tal documento la expresión

//Description 

selecciona nada (porque no hay Description (o cualquier otro elemento) en el documento que pertenece a "ningún espacio de nombres" - todo elemento los nombres pertenecen al espacio de nombres predeterminado).

Solución:

definir un espacio de nombres en su XSLT que tiene el mismo namespace-uri() como espacio de nombre por defecto del documento XML. A continuación, utilice el prefijo del espacio de nombres de modo definido por cualquier nombre que se utiliza en una expresión XPath:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://switchwise.com.au/"> 
    <xsl:output method="html"/> 
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:copy-of select="//x:Description" /> 
    </xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación al documento XML proporcionado:

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LookupValue> 
    <Description>AGL</Description> 
    <Value>8</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Australian Power &amp; Gas</Description> 
    <Value>6</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>EnergyAustralia</Description> 
    <Value>13</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Origin Energy</Description> 
    <Value>9</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>TRU Energy</Description> 
    <Value>7</Value> 
    </LookupValue> 
</ArrayOfLookupValue> 

la deseada, correcta resultado es producido:

<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>AGL</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>Australian Power &amp; Gas</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>EnergyAustralia</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>Origin Energy</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>TRU Energy</Description> 
+0

+1 buena respuesta. ¿Cómo se marca una pregunta como una pregunta frecuente por cierto? – LarsH

+0

@LarsH: no creo que haya una manera de marcar una pregunta como una pregunta frecuente, en este momento las preguntas frecuentes están determinadas por el número de visitas que tienen, que en realidad es "las más vistas". Y lo que necesitamos no es FAQ FAT bat - temas que se preguntan con frecuencia :) –

+0

LOL - ¡Qué fácil es que cuando sepas cómo!Muchas gracias por una respuesta tan simple y fácil de entender, he puesto estos cambios en mi XSL y está funcionando como esperaba. ¡¡Gracias de nuevo!! – Rob