Wie man einen Vorfahrenzweig eines Knotens, der über den xpath-Parameter ausgewählt wurde, in die XSLT-Ausgabe einbezieht

8

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?

    
Brunsaim 23.06.2011, 18:01
quelle

3 Antworten

6

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:

  1. 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.

  2. Eine Vorlage, die mit Elementen übereinstimmt, die zur Knotengruppe $subSelectionXPath gehören. Hier kopieren wir den gesamten Unterbaum, der in diesem Element verwurzelt ist.

  3. Beachten Sie die Verwendung des XPath 2.0 intersect Operators.

  4. 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 :

%Vor%     
Dimitre Novatchev 24.06.2011, 02:09
quelle
3

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%     
Robert Rossney 23.06.2011 20:01
quelle
2

Dies ist eine andere rekursionsbasierte Lösung. Erklärung:

  • zuerst Apply-Vorlagen für den letzten Vorfahren
  • dann, wenn Vorfahre des aktuellen Parameter-Knoten es kopieren und wenn Eltern den Knoten kopieren und beenden, andernfalls recurse

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%     
Emiliano Poggi 23.06.2011 20:30
quelle

Tags und Links