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 à tout élément descendant du nœud racine . Autrement dit, tout élément, sauf le nœud racine.
[...]
est un prédicat , il filtre l'ensemble de nœuds. Elle retourne les nœuds pour lesquels ...
est true
:
Un prédicat filtre un ensemble de nœuds [...] pour produire un nouvel ensemble de nœuds. Pour chaque nœud de l'ensemble de nœuds à filtrer, le PredicateExpr est évalué [...]; si PredicateExpr est évalué comme vrai pour ce nœud, le nœud est inclus dans le nouvel ensemble de nœuds; sinon, il n'est pas inclus.
contains('haystack', 'needle')
renvoie true
si haystack
contient needle
:
Fonction: booléen contient (chaîne, chaîne)
La fonction contains renvoie true si la première chaîne d'arguments contient la deuxième chaîne d'arguments, et renvoie sinon false.
Mais contains()
prend une chaîne comme premier paramètre. Et ce sont des nœuds passés. Pour gérer cela, chaque nœud ou ensemble de nœuds transmis en tant que premier paramètre est converti en chaîne par la string()
fonction:
Un argument est converti en type chaîne comme si en appelant la fonction chaîne.
string()
retourne la fonction string-value
du premier nœud :
Un ensemble de nœuds est converti en chaîne en renvoyant la valeur de chaîne du nœud dans 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 renvoyé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 descendants de nœud de texte du nœud d'élément dans l'ordre des documents.
string-value
d'un nœud de texte :
La valeur de chaîne d'un nœud de texte correspond aux données de caractère.
Donc, fondamentalement, string-value
tout le texte est contenu dans un nœud (concaténation de tous les nœuds de texte descendants).
text()
est un test de nœud qui correspond à n'importe quel nœud de texte:
Le texte de test du nœud () est vrai pour tout nœud de texte. Par exemple, child :: text () sélectionnera les enfants du nœud de texte du nœud de contexte.
Cela dit, //*[contains(text(), 'ABC')]
correspond à tout élément (sauf le nœud racine), dont le premier nœud de texte contient ABC
. Depuis text()
retourne un ensemble de nœuds qui contient tous les nœuds de texte enfant du nœud de contexte (par rapport auxquels une expression est évaluée). Mais contains()
ne prend que le premier. Donc, pour le document au-dessus du chemin correspond à l' Street
élément.
L'expression suivante //*[text()[contains(., 'ABC')]]
correspond à tout élément (mais le nœud racine) qui contient au moins un nœud de texte enfant ABC
. .
représente le nœud de contexte. Dans ce cas, il s'agit d'un nœud de texte enfant de tout élément sauf le nœud racine. Donc, pour le document au-dessus, le chemin correspond Street
aux Comment
éléments et.
Maintenant, //*[contains(., 'ABC')]
correspond à tout élément (mais le nœud racine) qui contient ABC
(dans la concaténation des nœuds de texte descendants). Pour le document ci-dessus, il correspond aux éléments Home
, the Addr
, the Street
et Comment
. En tant que tel, //*[contains(., 'BLAH ABC')]
correspond à la Home
, les Addr
, et les Comment
éléments.
//*[contains(text(),'ABC')]
ne renvoie que l'<Street>
élément. Il ne retourne aucun ancêtre de<Street>
ou<Comment>
.