Comment trouver tous les nœuds entre deux H3 en utilisant XPATH?Comment trouver tous les nœuds entre deux H3 en utilisant XPATH?
Répondre
Dans XPath 1.0 une façon d'y parvenir est d'utiliser la méthode Kayessian pour intersection ensemble de nœuds:
$ns1[count(.|$ns2) = count($ns2)]
L'expression ci-dessus sélectionne exactement les noeuds qui font partie à la fois de l'ensemble de nœuds $ns1
et l'ensemble de nœuds $ns2
.
Pour appliquer à la question spécifique - disons que nous devons sélectionner tous les noeuds entre le 2ème et 3ème élément h3
dans le document XML suivant:
<html>
<h3>Title T31</h3>
<a31/>
<b31/>
<h3>Title T32</h3>
<a32/>
<b32/>
<h3>Title T33</h3>
<a33/>
<b33/>
<h3>Title T34</h3>
<a34/>
<b34/>
<h3>Title T35</h3>
</html>
Nous devons remplacer $ns1
avec:
/*/h3[2]/following-sibling::node()
et de remplacer $ns2
avec:
/*/h3[3]/preceding-sibling::node()
Ainsi, l'expression XPath complète est:
/*/h3[2]/following-sibling::node()
[count(.|/*/h3[3]/preceding-sibling::node())
=
count(/*/h3[3]/preceding-sibling::node())
]
Nous pouvons vérifier que cela est l'expression XPath correcte:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/h3[2]/following-sibling::node()
[count(.|/*/h3[3]/preceding-sibling::node())
=
count(/*/h3[3]/preceding-sibling::node())
]
"/>
</xsl:template>
</xsl:stylesheet>
Lorsque cette transformation est appliqué sur le document XML présenté ci-dessus, le wante d, résultat correct est produit:
<a32/>
<b32/>
II. XPath 2.0 Solution:
Utilisez l'opérateur intersect
:
/*/h3[2]/following-sibling::node()
intersect
/*/h3[3]/preceding-sibling::node()
Une solution plus générale - dans XPath 2.0 - en supposant que vous voulez noeuds à toutes les profondeurs d'arbres entre les deux éléments h3, qui ne serait pas nécessairement être frères et soeurs.
/path/to/first/h3/following::node()[. << /path/to/second/h3]
Autre solution XPath 1.0 quand vous savez que les deux marques sont les mêmes éléments (ce cas h3
):
/html/body/h3[2]/following-sibling::node()
[not(self::h3)]
[count(preceding-sibling::h3)=2]
@ utilisateur3457812 , merci, ça marche pour moi! –
Basé sur dimitre-novatchev excellente réponse que je peux avec la solution de suivi que, plutôt que hardcoding [ 2] et [3] pour les différents H3 je donne juste le contenu de l'en-tête du premier item.
//h3[text()="Main Page Section Heading"]/following-sibling::node()
[ count(.|//h3[text()="Main Page Section Heading"]/following-sibling::h3[1]/preceding-sibling::node()) =
count(//h3[text()="Main Page Section Heading"]/following-sibling::h3[1]/preceding-sibling::node()) ]
où je veux aller plus loin si est d'être en mesure de traiter le scénario quand je regarde le dernier H3, et obtenir tout ce qui suit, dans le cas ci-dessus, je ne peux pas obtenir ce qui suit le dernier H3.
Il y a une autre grande solution générique à l'aide des touches, en supposant que vos <h3>
balises ont une propriété unique (par exemple, le texte ou un attribut id
):
<xsl:key name="siblings_of_h3" match="*[not(self::h3)]" use="preceding-sibling::h3[1]/text()"/>
<xsl:template match="h3">
<!-- now select all tags belonging to the current h3 -->
<xsl:apply-templates select="key('siblings_of_h3', text())"/>
</xsl:template>
Elle regroupe toutes les balises de leur précédent <h3>
- 1. Comment interroger tous les nœuds entre deux nœuds d'un arbre?
- 2. Comment puis-je sélectionner tous les nœuds de texte entre deux éléments, en utilisant XSL?
- 3. Comment trouver tous les nœuds de texte entre les nœuds d'éléments avec Javascript/JQuery?
- 4. XPATH - Sélectionner tous les nœuds enfants avec un attribut spécifique
- 5. Comment trouver tous les chemins entre deux sommets en utilisant QuickGraph
- 6. XPath: Comment vérifier plusieurs attributs entre les nœuds similaires
- 7. XPath: Sélectionnez tous les nœuds suivants jusqu'à un nœud
- 8. XPath: Comment sélectionner les nœuds sans attributs?
- 9. trouver le nombre de nœuds entre deux éléments avec jquery?
- 10. Trouver h3 et les balises h4 dessous
- 11. Communication entre deux nœuds Cassandra
- 12. Convertir les attributs de tous les nœuds en nœuds enfants
- 13. Shortest XPath pour trouver minimum/maximum de nœuds datetime fratrie
- 14. Comment puis-je supprimer tous les éléments correspondant à un xpath en python en utilisant lxml?
- 15. Trouver le nombre de nœuds dans PHP, DOM, XPath
- 16. XPath concat plusieurs nœuds
- 17. Comment trouver toutes les sous-arborescences vides dans XPath
- 18. Trouver le delta entre deux xelements en utilisant "sauf" C#
- 19. Comment trouver le chemin le plus long dans un graphique cyclique entre deux nœuds?
- 20. Supprimer tous les nœuds de xml en excluant des nœuds spécifiques en utilisant XSLT
- 21. Requête pour trouver tous les nœuds à deux pas d'un nœud particulier
- 22. Obtenir tous les nœuds entre le nœud actuel et un autre sans courant()?
- 23. XmlNodeList xPath pour filtrer les nœuds
- 24. Afficher tous les changesets entre deux étiquettes
- 25. Résumer tous les nœuds
- 26. nœuds de recherche avec xpath en Java
- 27. obtenir des nœuds communs entre deux balises
- 28. Comment trouver des noeuds entièrement entre deux noeuds spécifiés
- 29. Trouver tous les nœuds XML à l'aide coldfusion
- 30. XPath maux de tête, trouver des nœuds avec des attributs entre
+ 1 mai le droit prévaudra toujours. :-) – LarsH
+1 pour la solution la plus générale et l'invocation de Theory –
nice stuff. il a travaillé en ligne un charme – klumsy