Wie man Knoten-Wert mit variable-Knoten-name?
Ich habe ein XML-Dokument wie:
<data>
<item type="apple">
<misc>something</misc>
<appleValue>23</appleValue>
<misc2>something else</misc2>
</item>
<item type="banana">
<bananaValue>47</bananaValue>
<random>something</random>
</item>
</data>
Kann ich die Einzelteile erhalten mit doc("data.xml")/data/item
aber ich brauche, um den text aus den Elementen, die am Ende mit Value
. Also ich würde gerne "23" und "47", aber ich muss nicht unbedingt wissen, den Namen der Elemente, was bedeutet, alles, was ich wirklich weiß ist, gibt es Elemente, die in Value
ich weiß nicht, ob es appleValue
, bananaValue
usw. außer, dass ich mir ansehen konnte, die type
Attribut und Aufbau einer Zeichenkette.
let $type := (doc("data.xml")/data/item)[1]/@type
doc("data.xml")/data/item/$typeValue
...Die Letzte Zeile ist das, was ich versuche zu bekommen, klar, dass ist nicht ganz richtig, aber ich brauche zu finden-Elemente, deren name bekannt ist basierend auf eine variable (in einer Variablen gespeichert, wie $type
) und "Wert".
Irgendwelche Ideen? Ich weiß, das variable element Namensgebung ist seltsam/seltsam/schlecht...aber das ist so wie es ist und ich habe mit ihm zu beschäftigen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vermeiden, mit der
name()
Funktion zu Gunsten der entwedernode-name()
oderlocal-name()
. Der Grund dafür ist, dassname()
können geben Sie verschiedene Antworten-je nachdem, was (und ob) namespace-Präfixe sind in der Quelle verwendet wurde. Zum Beispiel, die folgenden drei Elemente haben den gleichen genauen Namen (QName):Jedoch die
name()
Funktion geben Sie eine andere Antwort für jede (appleValue
,x:appleValue
, undy:appleValue
, beziehungsweise). So sind Sie besser dran, entweder ignorieren Sie den namespace mithilfelocal-name()
(die gibt den string zurückappleValue
für alle drei oben genannten Fällen) oder die explizite Angabe des Namensraum (auch wenn es leer ist, wie Oliver zeigte), mitnode-name()
(das gibt einen richtigen QName Wert, sondern als ein string). In diesem Fall, da Sie nicht mit namespaces (und da sogar, wenn Sie später ein, wird der code immer noch funktioniert), würde ich etwas zugunsten vonlocal-name()
wie folgt:Für die Ausarbeitung über die Gründe zu vermeiden, die
name()
Funktion (und Ausnahmen), siehe "Gefahren des namens Funktion".Habe ich es Dank diesem Beitrag: Können XPath-match auf Teile des Elementnamens?
Können Sie auf die Namen der Knoten mit
name()
. XPath 1.0 verfügt nicht über eine "endet mit" - Funktion, aber mitsubstring()
undstring-length()
- 1 können Sie dort bekommen.Eine genauere Möglichkeit dies umzusetzen wäre