Angesichts dieses vereinfachten Datenformats:
<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>
Wie würden Sie alle C
s, D
s und E
s auswählen, die untergeordnete B
Elemente von Elementen sind?
Grundsätzlich so etwas wie:
a/b/(c|d|e)
In meiner eigenen Situation, anstatt nur a/b/
die Abfrage der Auswahl diejenigen führt C
, D
, E
Knoten ist eigentlich recht komplex , so würde Ich mag , dies zu vermeiden tun:
a/b/c|a/b/d|a/b/e
Ist das möglich?
or
ist ein logischer Operator - er arbeitet mit zwei Booleschen Werten. Der XPath- Union- Operator|
arbeitet mit zwei Knotensätzen. Diese sind sehr unterschiedlich und es gibt spezifische Anwendungsfälle für jeden von ihnen. Die Verwendung|
kann das ursprüngliche Problem lösen, führt jedoch zu einem längeren und komplexeren und schwieriger zu verstehenden XPath-Ausdruck. Der einfachere Ausdruck in dieser Antwort, der denor
Operator verwendet, erzeugt den gewünschten Knotensatz und kann im Attribut "select" einer<xsl:for-each>
XSLT-Operation angegeben werden. Probier es einfach.local-name()
ist nur dann richtig , wenn wir alle Elemente mit dem lokalen Namen, unabhängig von dem Namensraum des Element in ist auswählen möchten Dies ist ein sehr seltener Fall - in der Regel Menschen tut Pflege über die Unterschiede zwischen:.kitchen:table
Undsql:table
oder zwischenarchitecture:column
,sql:column
,array:column
,military:column
Sie können die Wiederholung stattdessen mit einem Attributtest vermeiden:
Im Gegensatz zu Dimitres antagonistischer Meinung ist das oben Gesagte in einem Vakuum, in dem das OP die Interaktion mit Namespaces nicht spezifiziert hat, nicht falsch . Die
self::
Achse ist namespace-restriktiv,local-name()
nicht. Wenn das OP beabsichtigt,c|d|e
unabhängig vom Namespace zu erfassen (was angesichts der ODER-Natur des Problems sogar ein wahrscheinliches Szenario ist), ist es "eine andere Antwort, die noch einige positive Stimmen hat", die falsch ist.Sie können ohne Definition nicht endgültig sein, obwohl ich meine Antwort gerne als wirklich falsch lösche, wenn das OP seine Frage so klärt, dass ich falsch bin.
quelle
local-name()
, bedeutet das, dass Tags mit einem beliebigen Namespace übereinstimmen würden?self::
Welchen Namespace müsste ich verwenden , wenn ich ihn verwende ? Wie würde ich nur zusammenpassenOhMy:c
?Warum nicht
a/b/(c|d|e)
? Ich habe es gerade mit der sächsischen XML-Bibliothek versucht (gut verpackt mit etwas Clojure-Güte), und es scheint zu funktionieren.abc.xml
ist das von OP beschriebene Dokument.quelle
Ich bin mir nicht sicher, ob dies hilft, aber mit XSL würde ich Folgendes tun:
und wird dieser XPath nicht alle Kinder von B-Knoten auswählen:
quelle