So würde ich es machen, indem ich die münchnerische Methode verwende. Google "xslt muenchean" für mehr Informationen von klügeren Menschen. Es könnte einen schlauen Weg geben, aber ich überlasse das anderen.
Eine Anmerkung, ich vermeide die Verwendung von Großbuchstaben am Anfang von XML-Elementnamen, z. B. "Datei", aber das liegt bei Ihnen.
%Vor%Die Idee ist, jedes Dateielement mit seinem Textwert einzugeben. Zeigen Sie dann die Dateiwerte nur an, wenn sie das gleiche Element wie das Schlüsselelement sind. Um zu überprüfen, ob sie identisch sind, verwenden Sie generate-id. Es gibt einen ähnlichen Ansatz, bei dem Sie das erste übereinstimmende Element vergleichen. Ich kann Ihnen nicht sagen, was effizienter ist.
Ich habe den Code hier mit Marrowsoft Xselerator getestet, meinem liebsten xslt-Tool, obwohl nicht mehr verfügbar, afaik. Das Ergebnis ist:
%Vor%Dies verwendet msxml4.
Ich habe die Ausgabe nach Datei sortiert. Ich bin mir nicht sicher, ob du das wolltest.
Ich hoffe, das hilft.
Diese Lösung ist ein bisschen einfacher, effizienter und gleichzeitig allgemeiner als die von Richard vorgestellte:
Diese Umwandlung :
%Vor%bei Anwendung auf das bereitgestellte XML-Dokument :
%Vor%Erzeugt das gewünschte Ergebnis :
%Vor% Beachten Sie das einfache Übereinstimmungsmuster der ersten <xsl:key>
und wie wir mit einem zweiten <xsl:key>
alle " Description
" Elemente finden, die Geschwister eines " File
" Elements sind, das einen bestimmten Wert hat.
Wir hätten mehr Vorlagen anstelle von <xsl:for-each>
verwenden können -Verarbeitung, dies ist jedoch ein recht einfacher Fall und die Lösung profitiert wirklich von kürzerem, kompakterem und besser lesbarem Code.
Beachten Sie auch, dass in XSLT 2.0 normalerweise <xsl:for-each-group>
Anweisung anstelle der Münchische Methode .
Diese XSLT 1.0 Lösung wird auch den Zweck erfüllen. Etwas prägnanter als die anderen Lösungen!
%Vor%Ergebnis:
%Vor%