2010-04-23 11 views
9

Digamos que tengo un documento html completo como entrada XML.
¿Cómo se vería el archivo XSLT si solo quisiera mostrar la primera (o cualquiera) imagen del html?XSLT Obtiene la primera aparición de una etiqueta específica

+0

¿Qué ha conseguido hasta ahora? ¿Qué no está funcionando? – Oded

+0

Buena pregunta (+1). Ver mi respuesta para la única solución correcta hasta ahora. :) –

Respuesta

17

expresión Uno XPath que selecciona el primer <img> elemento de un documento es:

(//img)[1]

hacer la nota que un error frecuente - como se hizo por @Oded en su respuesta es sugieren la siguiente expresión XPath: en general, puede seleccionar más de un elemento:

//img[1] (: INCORRECTO !!! :)

Esto selecciona todos los <img> elementos en el documento, cada uno de los cuales es el primer hijo <img> de su elemento primario.

Aquí está la explicación exacta de este error frecuente - en el W3C XPath 1.0 Recommendation:

NOTA: La ruta de ubicación //para[1] no significa lo mismo que la ruta de ubicación /descendant::para[1]. Este último selecciona el primer elemento descendente para; el primero selecciona todos los descendientes para elementos que son los primeros para hijos de sus padres.

Existe otro problema si el documento ha definido un espacio de nombres predeterminado, que debe ser el caso con XHTML. XPath trata cualquier nombre sin prefijo como pertenecientes a no espacio de nombres y la expresión (//img)[1] selecciona ningún nodo, ya que no existe ningún elemento en el documento que pertenece a no espacio de nombres y tiene nombre img.

En este caso hay dos formas de especificar la expresión deseada XPath:

  1. (//x:img)[1] - donde se asocia el prefijo x (por el lenguaje de hosting) con el namespcae predeterminado específico (en este caso esta es el espacio de nombres XHTML ).

  2. (//*[name()='img'])[1]

+0

¿Su ejemplo 'incorrecto' falta un '[1]'? – AakashM

+0

@AakashM: Gracias, corregido. –

+1

Gran explicación, gran solución. – Lobo

2

La expresión XPath recuperará la primera imagen de una página HTML: (//img)[1].

Consulte la respuesta en @Dimitre Novatchev para obtener más información sobre problemas con ella.

+0

Consulte mi respuesta para obtener una explicación del problema con su respuesta. Lea la especificación XPath: la definición de la abreviatura '//' y busque este error frecuente.Si el problema aún no está claro, haga una pregunta por separado y muchas personas estarán encantadas de explicarlo. :) –

+0

** Esta respuesta es W R O N G ** !!!!! Ver mi respuesta para una explicación. –

+0

Definitivamente no quiero leer las especificaciones de XPath. Pero veo lo que dice Dimitre. El '// img [1]' seleccionará la primera etiqueta img de * any * parent en lugar de la primera del documento. –

Cuestiones relacionadas