Ich habe eine Anforderung, eine sequentielle XML-Knotenliste in eine hierarchische zu transformieren, aber ich stoße in eine XSLT-spezifische Wissenslücke. Die Eingabe-XML enthält Artikel, Farben und Größen. Im folgenden Beispiel ist "Record1" ein Artikel, "Record2" repräsentiert eine Farbe und "Record3" sind die Größen. Die Anzahl der Farben und Größen (record2 und record3) kann variieren.
%Vor%Alle Felder sind auf derselben Hierarchieebene, aber ich muss diese Struktur trotzdem als Ausgabe erstellen:
%Vor%Ich habe versucht, die Knoten der Reihe nach zu iterieren, aber zum Beispiel muss der Knoten 'article' (= record1) nicht geschlossen bleiben, während 'color' (= record2) Knoten verarbeitet werden. Dasselbe gilt für die Verarbeitung von "Größe" (= Datensatz3), bei der "Farbe" nicht geschlossen ist, dies wird jedoch von XSLT nicht zugelassen. Meine nächste Idee war, eine Vorlage für jeden Artikel, jede Farbe und jede Größe aufzurufen, aber ich weiß nicht, wie man zum Beispiel alle 'record3'-Knoten zwischen dem aktuellen' record2 'und dem nächsten durch' record1 'repräsentierten Artikel auswählt / p>
Ich habe auch eine Einschränkung für die XSLT-Version, weil ich diese Umwandlung in BizTalk Server brauche, die nur XSLT 1.0 unterstützt
Kann mich jemand in die richtige Richtung drängen?
Hier ist eine XSLT 1.0 Option. Ich bin mir nicht sicher, was Sie mit den Werten von Record1 und Record2 machen wollten, also gebe ich sie in ein val
-Attribut ein.
XML-Eingabe
%Vor%XSLT 1.0
%Vor%XML-Ausgabe
%Vor%Die Lösungen von DevNull und Novatchev sind beide machbar. Eine dritte Lösung, und die, die mir am elegantesten erscheint, ist die "Geschwisterrekursion". Ich gebe den Code nicht vollständig, aber Sie beginnen mit einer Vorlagenregel für die Wurzel wie folgt:
%Vor%und dann Vorlagenregeln für die verschiedenen "Ebenen", die ungefähr so aussehen:
%Vor%und ähnlich für jedes Level. Diese Lösung ist wahrscheinlich schneller und prägnanter als die anderen, obwohl es ein bisschen "verrückt" sein kann, bis man sich daran gewöhnt hat. Der Schlüssel zum Verständnis ist, dass Sie auf jeder Ebene zuerst das erste "logische Kind" verarbeiten - das heißt, das nächste Element in der flachen Sequenz, vorausgesetzt, es befindet sich auf einer tieferen Ebene als das aktuelle Element; und dann verarbeiten Sie das nächste "logische Geschwister" - das nächste Element in der flachen Sequenz, das auf der gleichen Ebene wie das aktuelle ist. Die Lösung kann natürlich für Fälle angepasst werden, in denen möglicherweise Ebenen fehlen oder bei denen die Ebenenanzahl durch ein Attribut und nicht durch den Elementnamen angezeigt wird. Es kann sogar für den Fall angepasst werden, dass die Anzahl der Ebenen nicht im Voraus bekannt ist: Sie verwenden einfach eine einzige Regel, in der die Auswahl von "erstes logisches Kind" und "nächstes logisches Geschwister" passend parametrisiert ist.
Hier ist eine einfachere und wahrscheinlich effizientere Transformation mit Schlüsseln:
%Vor%Wenn diese Umwandlung auf das bereitgestellte XML-Dokument angewendet wird:
%Vor%das gewünschte, korrekte Ergebnis wird erzeugt:
%Vor%Erläuterung :
Der Schlüssel mit dem Namen kColors
drückt die Menge der Elemente Record2
( color
) als Funktion ihres logischen übergeordneten Elements Record1
( article
) aus.
In ähnlicher Weise drückt der Schlüssel kSizes
die Menge der Elemente Record3
( size
) als Funktion ihres logischen übergeordneten Elements Record2
( color
) aus.
Tags und Links xslt biztalk xslt-1.0 biztalk-2009 biztalk-mapper