2010-10-22 7 views
10

un livre que je lis sur XML dit que pour sélectionner tous les noeuds dans un fichier XML qui ont un attribut spécifique, utilisez la syntaxe:expression XPath pour sélectionner tous les noeuds avec un attribut commun

//*/@_attribute_ 

Ce que je Je ne comprends pas pourquoi l'astérisque est nécessaire. Si je comprends bien, l'expression // sélectionne tous les descendants du nœud racine. Ainsi, // @ lang, par exemple, ne sélectionnerait-il pas tous les descendants du nœud racine qui ont un attribut appelé "lang"? Je ne peux même pas interpréter ce que l'astérisque signifie même dans l'expression ci-dessus (je sais que l'astérisque signifie en général «tout»). Si quelqu'un pouvait le décomposer pour moi, je l'apprécierais vraiment.

Merci

+0

Bonne question, +1.Voir ma réponse pour une petite correction de la déclaration de @ Alejandro que votre expression XPath est "fausse". @ La réponse d'Alejandro est bonne, sauf qu'il n'y a rien de mal avec cette expression XPath. –

Répondre

14

Salut, un livre que je lis sur XML dit que pour sélectionner tous les nœuds dans un fichier XML qui ont un attribut spécifique, utiliser la syntaxe:

//*/@attribute

C'est faux. Il sera étendu à:

/descendant-or-self::node()/child::*/attribute::attribute 

Signification: Tous les attribute attributs d'un élément enfant d'un noeud étant le document racine lui-même ou l'un de ses descendats

Vous avez besoin:

/descendant::*[attribute::attribute] 

ou la forme abrégée

//*[@attribute] 

A propos du *: formel est un test de nom pas un test de type de nœud . Dans XPath 1.0, il n'y a pas de test de type d'élément. Dans XPath 2.0, vous avez element(). Alors, pourquoi ne sélectionner que des éléments? Eh bien, ce n'est pas le cas. L'axe a un type de nœud principal, de http://www.w3.org/TR/xpath/#node-tests:

Chaque axe a un type de nœud principal. Si un axe peut contenir des éléments, alors le type de nœud principal est élément; sinon, c'est le type des nœuds que l'axe peut contenir. Ainsi,

  • Pour l'axe des attributs, le type de nœud principal est l'attribut.
  • Pour l'axe de l'espace de noms, le type de nœud principal est un espace de noms.
  • Pour les autres axes, le type de nœud principal est l'élément.

Voilà pourquoi *, child::*, self::*, descendant::*, etc. sélectionne des éléments, mais @* ou attribute::* ou namespace::* sélectionne les attributs ou dans les espaces de noms de portée.A propos de predicate (partie [@attribute]): cette expression est évaluée avec chacun des nœuds sélectionnés par la dernière étape. Il attend une valeur booléenne pour le filtrage. La valeur booléenne d'un ensemble de noeuds (c'est le résultat pour attribute::attribute) est false pour un ensemble de noeuds vide, et true sinon.

+0

@Alejandro. Il n'y a * rien * de faux avec '// */@ x' sauf qu'il est plus long qu'il ne pourrait l'être. –

12

Le titre de cette question est:

expression XPath pour sélectionner tous nœuds avec un attribut commun

ne porte toutefois nulle part le texte de la question de discuter comment trouver tho tous les nœuds qui ont un attribut commun - donc le titre peut être incorrect.

Pour trouver tous les nœuds qui ont un attribut commun nommé x (BTW, seuls nœuds d'éléments peuvent avoir des attributs), utilisation:

//*[@x] 

Utilisation:

//@x 

pour sélectionner tous les attributs nommés x dans le document XML. C'est probablement l'expression la plus courte pour le faire.

Il n'y a rien de mal à:

//*/@x 

sauf qu'il est un peu plus longue.

Il est un raccourci pour:

/descendant-or-self::node()/child::*/attribute::x 

et permet aussi de sélectionner tous les attributs x dans le document XML.

Quelqu'un peut penser que cette expression ne sélectionne pas l'attribut x de l'élément supérieur du document. Ceci est une conclusion erronée, parce que le premier emplacement étape:

/descendant-or-self::node() 

sélectionne chaque nœud dans le document, y compris la racine elle-même (/) .

Cela signifie que:

/descendant-or-self::node()/child::* 

sélectionne tous les éléments, y compris l'élément supérieur (qui est le seul enfant du nœud racine dans un document XML bien formé).

Ainsi, lorsque le dernier emplacement étape /@x est finalement ajouté, cela sélectionnera tous les x attributs de tous les noeuds sélectionnés jusqu'à présent par les deux premières étapes de l'emplacement - qui est tous x attributs de tous les nœuds d'éléments dans le fichier XML document.

+2

+1 Merci pour la clarification. J'aime toujours lire vos réponses. – Garett

Questions connexes