Le document XML :
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
L'expression XPath :
//*[contains(text(), 'ABC')]
//*
correspond à n'importe quel élément descendant de la Nœud racine . C'est-à-dire tout élément sauf le nœud racine.
[...]
est un prédicat il filtre l'ensemble des nœuds. Il renvoie les nœuds pour lesquels ...
es true
:
Un prédicat filtre un ensemble de nœuds [...] pour produire un nouvel ensemble de nœuds. Pour chaque noeud de l'ensemble de noeuds à filtrer, l'expression PredicateExpr est évaluée [...] ; si l'expression PredicateExpr est vraie pour ce noeud, celui-ci est inclus dans le nouvel ensemble de noeuds ; sinon, il n'est pas inclus.
contains('haystack', 'needle')
renvoie à true
si haystack
contient needle
:
Fonction : boolean contains(string, string)
La fonction contains renvoie vrai si la chaîne du premier argument contient la chaîne du second argument, et sinon renvoie faux.
Pero contains()
prend une chaîne de caractères comme premier paramètre. Et on lui passe des noeuds. Pour gérer cela, chaque nœud ou ensemble de nœuds passé comme premier paramètre est converti à une chaîne de caractères par le string()
fonction :
Un argument est converti en type chaîne de caractères comme si on appelait la fonction chaîne de caractères.
string()
les fonctions de retour string-value
de le premier nœud :
Un ensemble de nœuds est converti en une chaîne de caractères en retournant la valeur de la chaîne de caractères du nœud de l'ensemble de nœuds qui est le premier dans l'ordre du document. Si l'ensemble de nœuds est vide, une chaîne vide est retournée.
string-value
d'un nœud d'élément :
La valeur de chaîne d'un nœud d'élément est la concaténation des valeurs de chaîne de tous les nœuds de texte descendants du nœud d'élément dans l'ordre du document.
string-value
d'un nœud de texte :
La valeur de la chaîne d'un nœud de texte est la donnée du caractère.
Donc, en gros string-value
est tout le texte contenu dans un nœud (concaténation de tous les nœuds de texte descendants).
text()
est un test de nœud qui correspond à tout nœud de texte :
Le test de nœud text() est vrai pour tout nœud de texte. Par exemple, child::text() sélectionnera les noeuds de texte enfants du noeud de contexte.
Ceci étant dit, //*[contains(text(), 'ABC')]
correspond à tout élément (sauf le nœud Root) dont le premier nœud de texte contient ABC
. Puisque text()
renvoie un ensemble de nœuds qui contient tous les nœuds de texte enfants du nœud de contexte (par rapport auquel une expression est évaluée). Mais contains()
ne prend que le premier. Ainsi, pour le document ci-dessus, le chemin correspond au Street
élément.
L'expression suivante //*[text()[contains(., 'ABC')]]
correspond à tout élément (à l'exception du nœud racine), qui a au moins un nœud de texte enfant, qui contient ABC
. .
représente le nœud de contexte. Dans ce cas, c'est un nœud de texte enfant de n'importe quel élément sauf le nœud Root. Ainsi, pour le document ci-dessus, le chemin correspond à l'élément Street
et le Comment
éléments.
Maintenant, alors, //*[contains(., 'ABC')]
correspond à tout élément (sauf le nœud racine) qui contient ABC
(dans la concaténation des nœuds de texte descendants). Pour le document ci-dessus, il correspond au Home
le Addr
le Street
et le Comment
éléments. En tant que tel, //*[contains(., 'BLAH ABC')]
correspond au Home
le Addr
et le Comment
éléments.
0 votes
D'après ce que je sais,
//*[contains(text(),'ABC')]
ne renvoie que le<Street>
élément. Elle ne renvoie pas d'ancêtres de<Street>
o<Comment>
.