2012-06-11 20 views
13

se me dio la siguiente XML:elemento XML tiene espacio de nombres, mi XPATH no funciona

<root> 
    <items> 
    <item> 
     <title>Item</title> 
     <details> 
     <data xmlns="http://some_url"> 
      <length>10</length> 
      <weight>1.2</weight> 
     </data> 
     </details> 
    </item> 
    </items> 
</root> 

Siguiendo XPath no funciona significa nada se imprime como el elemento de "datos" ¿no existe:

/root/items/item/details/data 

Pero cuando elimino el atributo de espacio de nombres "xmlns" del elemento "datos", se imprime su contenido. ¿Cómo debería funcionar la expresión xpath para funcionar sin eliminar el atributo de espacio de nombres "xmlns" del elemento "datos"?

Estoy usando SAXON y XSL 1.0.

+0

Tiene que registrar el espacio de nombres con su XPath e ngine, luego use el alias que registró en su XPath: 'alias: data/alias: length'. No podemos ser más específicos que eso sin saber lo que está utilizando para evaluar el XPath. –

Respuesta

13

Esta es una de los más frecuentes en XPath/XSLT:

XPath interpreta un nombre de elemento sin prefijo como pertenecientes a "ningún espacio de nombres", y esta es la razón los elementos con nombres sin prefijo que pertenecen a un espacio de nombres por defecto (no vacío) no se seleccionan cuando sólo su el nombre no prefijado se especifica como una prueba de nodo en una expresión XPath.

La solución es o bien:

  1. Crear una unión donde un prefijo (por ejemplo "x") está asociado con el espacio de nombres predeterminado espacio de nombres, a continuación, especifique x:elementName en lugar de elementName.

  2. utilizar expresiones largos, feos y poco fiables como: *[name() = 'elementName']

Aquí es una transformación XSLT utilizando el metodo1 anteriormente. :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://some_url"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/root/items/item/details/a:data/a:weight"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación (usando Saxon 6.5.4 o cualquier otro procesador XSLT compatible 1.0) en el documento XML proporcionado:

<root> 
    <items> 
     <item> 
      <title>Item</title> 
      <details> 
       <data xmlns="http://some_url"> 
        <length>10</length> 
        <weight>1.2</weight> 
       </data> 
      </details> 
     </item> 
    </items> 
</root> 

se selecciona el nodo correcto/se necesitan y su valor de cadena se copia a la salida:

1.2 
0

En XPath, debe asignar un prefijo al espacio de nombres. ¿Cómo se hace eso depende de la XPath de software/biblioteca que está utilizando, pero suponiendo que se asocia el URI de espacio http://some_url con el prefijo de espacio de nombres someUrl, puede cambiar su expresión XPath de la siguiente manera:

/root/items/item/details/someUrl:data 
+0

Gracias por la respuesta. Estoy usando SAXON y XSL 1.0. Intenté consultar xpath "/ root/items/item/details/a: data" e imprimí todo el contenido del elemento "data". Cuando pregunté "/ root/items/item/details/a: data/a: weight", esperaba que se imprimiera "1.2", pero volvió a imprimir todo el contenido del elemento "data". ¿Podrías por favor avisarme qué estoy haciendo mal? – Vojtech

+0

Como está utilizando XSL, ¿podría mostrar su hoja de estilo XSL completa? (¿o al menos una versión minimizada que esté razonablemente completa?) –

Cuestiones relacionadas