6 Stimmen

Zusammenführen von XML-Dateien

Ich habe mehrere XML-Dateien, deren Namen in einer anderen XML-Datei gespeichert sind.

Ich möchte XSL verwenden, um eine Zusammenfassung der Kombination der XML-Dateien zu erstellen. Ich erinnere mich, dass es eine Möglichkeit gab, dies mit den msxml-Erweiterungen (ich verwende msxml) zu tun.

Ich weiß, dass ich den Inhalt jeder Datei mit select="document(filename)" abrufen kann, aber ich bin mir nicht sicher, wie ich all diese Dokumente zu einem kombinieren kann.

21-Okt-08 Ich hätte erwähnen sollen, dass ich weitere Verarbeitung mit dem kombinierten XML durchführen möchte, sodass es nicht ausreicht, es einfach aus der Transformation auszugeben. Ich muss es als Knotensatz in einer Variablen speichern.

4voto

GerG Punkte 533

Hier ist nur ein kleines Beispiel, was du tun könntest:

datei1.xml:

Text aus Datei1

datei2.xml:

Text aus Datei2

index.xml:

datei1.xml
datei2.xml

zusammenfassen.xsl:

Anwenden des Stylesheets auf index.xml gibt dir:

Text aus Datei1Text aus Datei2

Der Trick besteht darin, die verschiedenen Dokumente mit der document-Funktion (von praktisch allen XSLT 1.0 Prozessoren unterstützte Erweiterungsfunktion) zu laden, den Inhalt als Teil eines Variablenkörpers auszugeben und dann die Variable in ein Knoten-Set für weitere Verarbeitung umzuwandeln.

0 Stimmen

Danke. Ich wusste, dass dies der richtige Ansatz ist, konnte aber nicht mehr daran erinnern, wie es geht. Ich benutze jetzt die msxml-Node-Set-Funktion anstelle der von Ihnen vorgeschlagenen exslt-Funktion (ich weiß, ich bin ein Ketzer) und komme irgendwohin.

2voto

mbesso Punkte 685

Angenommen, Sie haben die Dateinamen in einer Datei wie dieser aufgelistet:

    a.xml
    b.xml

Dann könnten Sie ein Stylesheet wie dieses für die obige Datei verwenden:

0 Stimmen

Dies ist das, was ich zunächst versucht habe, aber soweit ich sehen kann, kann ich diese Technik nicht verwenden, um das XML in eine Variable zu setzen, die ich weiter verarbeiten kann. Ich erhalte einen Fehler, der besagt, dass die Auswahl kein Knotensatz ist.

0voto

Tomalak Punkte 320467

Schau dir die document() Funktionsdokumentation an.

Du kannst document() verwenden, um weitere XML-Dokumente während des Transformationsprozesses zu laden. Sie werden als Knotensets geladen. Das bedeutet, dass du zunächst das XML, das die Dateinamen zum Laden enthält, dem XSLT übergeben würdest und von dort aus weitermachen würdest:

0 Stimmen

Vielen Dank dafür. Ich muss zusätzlichen Inhalt am Anfang des XML jeder Datei hinzufügen, um zu identifizieren, aus welcher Datei es stammt, daher bietet mir document() nicht genug Kontrolle. Trotzdem vielen Dank, da ich nicht über diese Erweiterungen von document() Bescheid wusste.

0voto

Richard A Punkte 2762

Danke für alle Antworten. Hier ist das Herzstück der Lösung, die ich mit msxml verwende.

Jetzt versuche ich, die Leistung zu verbessern, da jede Datei etwa 8 MB groß ist und die Transformation sehr lange dauert, aber das ist eine andere Frage.

0 Stimmen

Ich erkenne, dass Sie nur die 'Essenz' Ihrer Lösung veröffentlicht haben, aber dennoch ergibt eine Aussage wie nicht viel Sinn, da Sie gerade ein RTF in ein Knotenset umgewandelt und wieder zurück in ein RTF konvertiert haben. funktioniert genauso gut nur mit einem RTF als Argument.

0 Stimmen

Um die Leistung zu verbessern, würde ich tatsächlich vorschlagen, kein Stylesheet zu verwenden, abhängig von der Menge an Informationen, die Sie aus den einzelnen Dateien extrahieren möchten. Wenn Sie sie nur im Grunde genommen zusammenführen müssen (mit Entfernung des XML-Headers), dann sollte auch ein einfaches Skript in Ihrer bevorzugten Sprache ausreichen.

0 Stimmen

In Bezug auf das node-set(), möchte ich die Ausgabe als einen Knotensatz haben, auf dem ich weitere Verarbeitungen durchführen kann. Wenn ich versuche, die Ausgabe in ein Select-Attribut ohne das node-set() zu setzen, beschwert sich der Prozessor (zu Recht), dass es sich nicht um einen Knotensatz handelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X