Nachdem ich über 8 Stunden versucht habe, hoffe ich, dass mir jemand dabei helfen kann:
Gegeben das folgende (vereinfachte) XML für ein Buch:
%Vor%Ich bin in der Lage, einen beliebigen Teil (Abschnitt, Kapitel oder Absatz) des Buch-XML basierend auf einem gegebenen Parameter mit dem folgenden XSL zu extrahieren:
%Vor%und der Parameter $ subSelectionXPath mit einem Wert wie
%Vor%ergibt Ausgabe:
%Vor%Zusätzlich möchte ich erreichen, dass das ausgewählte XML-Fragment vom XML-Vorgängerzweig, d. h.:
, eingeschlossen wird %Vor%Ich stelle mir vor (und versuchte), den XML-Baum zu durchlaufen und zu testen, ob der aktuelle Knoten ein Vorgänger ist, etwas wie (Pseudocode):
%Vor%Ich habe auch mit xsl: key experimentiert, aber ich fürchte, dass meine Kenntnisse von XSLT hier zu Ende gehen. Irgendwelche Gedanken?
Aus Ihrem Code geht hervor, dass Sie XSLT 2.0 verwenden.
Diese XSLT 2.0-Umwandlung :
%Vor%bei Anwendung auf das bereitgestellte XML-Dokument :
%Vor%erzeugt genau das gewünschte, korrekte Ergebnis :
%Vor%Erläuterung : Wir haben nur zwei Vorlagen:
Eine Vorlage, die mit einem beliebigen Element übereinstimmt, dessen Nachkommen eine nicht leere Schnittmenge mit der Knotengruppe $subSelectionXPath
haben. Hier "kopieren" wir das Element flach und wenden Vorlagen auf seine untergeordneten Elemente an.
Eine Vorlage, die mit Elementen übereinstimmt, die zur Knotengruppe $subSelectionXPath
gehören. Hier kopieren wir den gesamten Unterbaum, der in diesem Element verwurzelt ist.
Beachten Sie die Verwendung des XPath 2.0 intersect
Operators.
Nein explizite Rekursion.
II. XSLT 1.0-Lösung :
%Vor%Wenn diese Transformation auf dasselbe XML-Dokument angewendet wird (wie oben bereits gezeigt), wird das gleiche gewünschte und korrekte Ergebnis erzeugt:
%Vor% Erläuterung : Dies ist im Wesentlichen die XSLT 2.0-Lösung, in der der XPath 2.0 intersect
-Operator in XPath 1.0 übersetzt wird, wobei die bekannte Formel von Kayessian (für @Michael Kay) für die Schnittmenge von zwei verwendet wird nodesets $ns1
und $ns2
:
Ich denke, das, was Sie erreichen wollen, ist eine rekursive Vorlage:
%Vor%Dies erzeugt, wenn es auf das von Ihnen bereitgestellte XML angewandt wird:
%Vor%Dies ist eine andere rekursionsbasierte Lösung. Erklärung:
Hier die Transformation:
%Vor%Bei Anwendung auf die in der Frage angegebene Eingabe wird unter der Annahme, dass der Eingabeparameterwert in der Frage derselbe ist, Folgendes erzeugt:
%Vor%