2010-04-23 3 views
9

Disons que j'ai un document html complet en entrée XML.
A quoi ressemblerait le fichier XSLT si je voulais seulement sortir la première (ou toute) image du code HTML?XSLT Obtenir la première occurrence d'un tag spécifique

+0

Qu'avez-vous obtenu jusqu'à présent? Qu'est-ce qui ne fonctionne pas? – Oded

+0

Bonne question (+1). Voir ma réponse pour la seule solution correcte jusqu'à présent. :) –

Répondre

17

Une expression XPath qui sélectionne le premier élément <img> dans un document est:

(//img)[1]

Prenez note que une erreur fréquente - rendu par @Oded dans sa réponse est à suggérer l'expression XPath suivante - en général, il peut sélectionner plus d'un élément:

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

Ceci sélectionne tous les éléments <img> dans le document, dont chacun est le premier <img> enfant de son parent.

Voici l'explication exacte de cette erreur fréquente - dans le W3C XPath 1.0 Recommendation:

NOTE: Le chemin d'accès //para[1] ne signifie pas la même chose que le chemin d'accès /descendant::para[1]. Ce dernier sélectionne le premier élément descendant para; le premier sélectionne tous les éléments descendants para qui sont les premiers enfants para de leurs parents.

Un autre problème existe si le document a défini un espace de noms par défaut, ce qui doit être le cas avec XHTML. XPath traite n'importe quel nom non préfixé comme appartenant à aucun espace de noms et l'expression (//img)[1] sélectionne aucun noeud, car aucun élément dans le document qui appartient à aucun espace de noms et a le nom img.

Dans ce cas, il y a deux façons de spécifier la recherché l'expression XPath:

  1. (//x:img)[1] - où le préfixe x est associé (par la langue d'hébergement) avec le namespcae par défaut spécifique (dans ce cas, ce est l'espace de noms XHTML ).

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

+0

Votre «mauvais» exemple manque-t-il un '[1]'? – AakashM

+0

@AakashM: Merci, corrigé. –

+1

Grande explication, excellente solution. – Lobo

2

L'expression XPath récupérera la première image d'une page HTML: (//img)[1]. Voir la réponse @Dimitre Novatchev pour plus d'informations sur les problèmes avec elle.

+0

Voir ma réponse pour une explication du problème avec votre réponse. Lisez la spécification XPath - la définition de l'abréviation '//' et recherchez cette erreur fréquente.Si le problème n'est toujours pas clair, posez une question distincte et beaucoup de gens seront heureux de vous expliquer. :) –

+0

** Cette réponse est W R O N G ** !!!!! Voir ma réponse pour l'explication. –

+0

Je ne veux définitivement pas lire la spécification XPath. Mais je vois ce que dit Dimitre. Le '// img [1]' sélectionnera le premier tag img de * any * parent plutôt que le premier du document. –

Questions connexes