Compte tenu de ce format de données simplifié:
<a>
<b>
<c>C1</c>
<d>D1</d>
<e>E1</e>
<f>don't select this one</f>
</b>
<b>
<c>C2</c>
<d>D2</d>
<e>E1</e>
<g>don't select me</g>
</b>
<c>not this one</c>
<d>nor this one</d>
<e>definitely not this one</e>
</a>
Comment sélectionneriez-vous tous les C
s, D
s et E
s qui sont des enfants d' B
éléments?
En gros, quelque chose comme:
a/b/(c|d|e)
Dans ma propre situation, au lieu de simplement a/b/
, la requête menant à la sélection ceux C
, D
, des E
noeuds est je serais en fait assez complexe pour éviter de faire comme ceci:
a/b/c|a/b/d|a/b/e
Est-ce possible?
or
est un opérateur logique - il opère sur deux valeurs booléennes. L' opérateur d' union XPath|
fonctionne sur deux ensembles de nœuds. Ceux-ci sont assez différents et il existe des cas d'utilisation spécifiques pour chacun d'eux. L'utilisation|
peut résoudre le problème d'origine, mais il en résulte une expression XPath plus longue et plus complexe et difficile à comprendre. L'expression plus simple de cette réponse, qui utilise l'or
opérateur, produit l'ensemble de nœuds voulu et peut être spécifiée dans l'attribut "select" d'une<xsl:for-each>
opération XSLT. Essayez-le.local-name()
n'est correcte que si nous voulons sélectionner tous les éléments avec ce nom local, quel que soit l'espace de nom dans lequel se trouve l'élément. C'est un cas très rare - en général, les gens se soucient des différences entre:kitchen:table
etsql:table
, ou entrearchitecture:column
,sql:column
,array:column
,military:column
Vous pouvez éviter la répétition avec un test d'attribut à la place:
Contrairement à l'opinion antagoniste de Dimitre, ce qui précède n'est pas incorrect dans le vide où l'OP n'a pas spécifié l'interaction avec les espaces de noms. L'
self::
axe est restrictif pour l'espace de noms,local-name()
n'est pas. Si l'intention du PO est de capturerc|d|e
indépendamment de l'espace de noms (ce que je suggérerais est même un scénario probable étant donné la nature OU du problème), alors c'est "une autre réponse qui a encore des votes positifs" qui est incorrecte.Vous ne pouvez pas être définitif sans définition, même si je suis tout à fait heureux de supprimer ma réponse comme étant véritablement incorrecte si le PO clarifie sa question de telle sorte que je suis incorrecte.
la source
local-name()
, cela signifie-t-il qu'il correspondrait aux balises avec n'importe quel espace de noms? Si j'utiliseself::
, quel espace de noms devrait-il correspondre? Comment pourrais-je correspondre uniquementOhMy:c
?Pourquoi pas
a/b/(c|d|e)
? Je viens d'essayer avec la bibliothèque XML Saxon (bien enveloppée avec un peu de bonté Clojure), et cela semble fonctionner.abc.xml
est le doc décrit par OP.la source
Je ne sais pas si cela aide, mais avec XSL, je ferais quelque chose comme:
et ce XPath ne sélectionnera-t-il pas tous les enfants des nœuds B:
la source