XPath-Vorfahren und Nachkommen in XLS kopieren-von
Ich bin neu in XPath, und von dem, was ich gelesen habe in einigen tutorials über die Achsen, ich bin immer noch am Rätseln, wie man diese umsetzen kann. Sie sind nicht ganz zu Verhalten wie ich es erwartet hatte. Ich bin besonders daran interessiert, ancestor und descendant-Achsen.
Ich habe die folgende XML-Struktur:
<file>
<criteria>
<root>ROOT</root>
<criterion>AAA</criterion>
<criterion>BBB</criterion>
<criterion>CCC</criterion>
</criteria>
<format>
<sort>BBB</sort>
</format>
</file>
Und ich habe die folgende XSL:
<xsl:template match="/">
<xsl:copy-of select="ancestor::criterion/>
</xsl:template>
denen nichts produziert!
Ich erwartet, dass es zu produzieren:
<file>
<criteria>
</criteria>
</file>
Kann mir jemand erklären, ancestor und descendant-Achsen, um mich in ein hilfreicher Weg, als die tutorials, die ich zuvor gelesen?
Dank!
Gute Frage (+1). Siehe meine Antwort für eine Erklärung und eine komplette Lösung.
InformationsquelleAutor developer | 2010-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es sollte!
ist ein relativer Ausdruck, was bedeutet, dass es ausgewertet wird, aus der aktuelle Knoten (abgestimmt über die Vorlage). Aber der aktuelle node der Dokument-node
/
.So, die oben ist äquivalent zu:
Jedoch durch die definition der Dokument-node
/
keine Eltern hat (und das bedeutet keine Vorfahren), so dass dieser XPath-Ausdruck kann nicht wählen Sie alle Knoten.Was Sie wahrscheinlich wollte, war:
oder
Den letzten zwei XPath-Ausdrücke sind äquivalent, und wählen Sie alle Elemente, die eine
criterion
Nachkomme.Schließlich zu produzieren, die Ausgabe, die Sie wollte, hier ist eine mögliche Lösung:
Wenn diese transformation wird angewendet auf das XML-Dokument, das die gewünschte Ausgabe erzeugt:
Warum erwarten Sie, dass ein XPath-Ausdruck, der wählt bestimmte Knoten, wählen Sie die anderen Knoten? In Fall müssen Sie ein anderes problem, einfach eine andere Frage stellen. Sie haben nicht die Frage gestellt, die nicht beantwortet wird. 🙂
InformationsquelleAutor Dimitre Novatchev
ancestor
ist für das auswählen von Knoten, die sind höher (näher an der Wurzel) in das XML-Dokument.descendant
ist für das auswählen von Knoten, die unteren (Kinder) in das XML-Dokument.In deinem Beispiel
ancestor::criterion
wählt nichts, da der aktuelle Knoten ist/
(Bedeutung der Wurzel des Dokuments -<file>
in diesem Fall), wie angezeigt, durchmatch="/"
. Der root-Knoten hat keine Vorfahren, damit dieancestor
Achse tut sich nichts.Um jeden
<criterion>
element, sollten Sie diedescendant
Achse:Oder deren Verknüpfung
//
:Wird Folgendes zurückgegeben:
Verwendung einer Schleife oder einer anderen Vorlage können Sie alle drei von Ihnen:
Diese erhalten Sie Folgendes:
Wenn Sie wollen, um die
<file>
- element, zu, es ist ein bisschen komplizierter. XPath-Knoten gibt und einfach kopiert werden, nicht kopieren Sie die Elemente, die Elemente, die Sie auswählen. Ich kann diesen Punkt klären mehr, wenn Sie immer noch verwirrt.<xsl:template match="/"> <xsl:copy-of select="//criterion"/> </xsl:template>
wird Folgendes zurückgegeben:<criterion>AAA</criterion>
ist Das nicht so. Das Ergebnis wird sein: ` <Kriterium>AAA</Kriterium> <Kriterium>BBB</Kriterium> <Kriterium>CCC</Kriterium> `Nur ein Punkt, aber
descendant::criterion
ist NICHT äquivalent zu//criterion
; die letzteren finden alle Kriterium Knoten im gesamten Dokument. Die richtige Verknüpfung ist.//criterion
.InformationsquelleAutor Welbog