Il y a une différence entre .
et text()
, mais cette différence peut pas surface à cause de votre document d'entrée.
Si votre document d'entrée ressemblait (le plus simple document on peut l'imaginer, compte tenu de vos expressions XPath)
Exemple 1
<html>
<a>Ask Question</a>
</html>
Ensuite, //a[text()="Ask Question"]
et //a[.="Ask Question"]
en effet de retour exactement le même résultat. Mais envisager un autre document d'entrée qui ressemble à
Exemple 2
<html>
<a>Ask Question<other/>
</a>
</html>
où l' a
élément a aussi un enfant de l'élément other
qui suit immédiatement après "Poser une Question". Compte tenu de cette deuxième document d'entrée, //a[text()="Ask Question"]
renvoie toujours l' a
, alors //a[.="Ask Question"]
ne retourne rien!
C'est parce que le sens des deux prédicats (tout ce qui est entre [
et ]
) est différent. [text()="Ask Question"]
signifie en réalité: retourne true si l'un des nœuds de texte d'un élément contient exactement le texte "Poser une Question". D'autre part, [.="Ask Question"]
moyen: retourne true si la chaîne de valeur de l'élément est identique à "Poser une Question".
Le XPath modèle, le texte à l'intérieur des éléments XML peut être divisée en un certain nombre de nœuds de texte si d'autres éléments d'interférer avec le texte, comme dans l'Exemple 2 ci-dessus. Là, l' other
élément est entre "Poser une Question" et un caractère de saut de ligne qui compte aussi comme un contenu de texte.
Pour prendre un exemple encore plus net, considérer comme un document d'entrée:
Exemple 3
<a>Ask Question<other/>more text</a>
Ici, l' a
élément contient en fait deux nœuds de texte, "Poser une Question" et "texte", puisque les deux sont les enfants directs d' a
. Vous pouvez le tester en exécutant //a/text()
sur ce document, qui sera de retour (résultats individuels séparés par ----
):
Ask Question
-----------------------
more text
Donc, dans un tel scénario, text()
renvoie un ensemble de nœuds individuels, tout en .
dans un prédicat correspond à la concaténation de chaîne de tous les nœuds de texte. Encore une fois, vous pouvez tester cette réclamation auprès de l'expression de chemin d'accès //a[.='Ask Questionmore text']
qui va réussir à revenir l' a
élément.
Enfin, gardez à l'esprit que certaines fonctions XPath ne pouvez prendre qu'une seule chaîne en entrée. Comme LarsH l'a souligné dans les commentaires, si une telle fonction XPath (par exemple, contains()
) est donnée une séquence de nœuds, il ne traitera que le premier nœud et silencieusement ignorer le reste.