xml daten zusammenführen
hh
- xsl
1 Dennis
Hi,
also wieder einmal ein kleines Problem mit großen Folgen fuer mich.
ich habe zwei große XML-Dateien (je 10 MB), die ich über eine XSL-Datei auswerten moechte. Aufbau von XML-File 1 etwa so:
<root>
<wert gleichesattribute="schluessel_x" attribute_1="wert_x1" attribute_2="wert_x2"/>
<wert gleichesattribute="schluessel_y" attribute_1="wert_y1" attribute_2="wert_y2"/>
...
...
</root>
XML-File 2
<root>
<wert gleichesattribute="schluessel_x" attribute_3="wert_x3" attribute_4="wert_x4"/>
<wert gleichesattribute="schluessel_y" attribute_3="wert_y3" attribute_4="wert_y4"/>
...
...
</root>
Nun hätte ich am liebsten ein einziges XML-File etwa so:
<root>
<wert gleichesattribute="schluessel_x" attribute_1="wert_x1" attribute_2="wert_x2" attribute_3="wert_x3" attribute_4="wert_x4"/>
...
...
</root>
Mir wäre aber auch schon geholfen, wenn ich eine Auswertung in xsl so machen könnte, dass ich in einer Tabellenzeile es so darstellen könnte (kurzfurm der Ideee):
schluessel_x ; wert_x1 ; wert_x1+wert_x4 ; wert_x3 div wert_x2 ; usw. usw.
Irgendiwe stehe ich auf dem Schlauch und weiss nicht, ob ich ein einziges Dokuemnt erstellen sollte und dann bequem dann die Auswertung fahren oder aber die Daten mit document() einbinden sollte, ohne die Original-Dateien zu einer einzigen verbinden zu muessen.
Gruß,
Holger
Hi hh,
Mit XSL kenne ich mich leider nicht wirklich aus - ich bin mir da aber auch nicht sicher, ob es sich damit überhaupt machen ließe, denn XSL ist ja nur eine Art Stylesheet für eine XML-Datei - ich glaube eher nicht, dass du mit XSL eine zweite Datei "dazu laden" kannst.
Kurz um, ich würde so etwas mit einer beliebigen Programmiersprache meiner Wahl lösen - z.B. mit PHP. Mit PHP5 und SimpleXML sollte das auch nicht so schwer sein - ich habe mal ein kleines Script geschrieben (siehe auch hier: Zusammenführung zweier XML-Dateien):
<?php
// Die beiden XML-Dateien einlesen
$xml1 = simplexml_load_file("1.xml");
$xml2 = simplexml_load_file("2.xml");
// Element-Baum initialisieren
$data = array();
// Erste Datei durchgehen
foreach($xml1->wert as $wert) {
// und jedes Element anhand seiner ID (gleiches Attribut)
// in den Element-Baum einhängen
$id = (string) $wert['gleichesattribute'];
$data[$id] = array();
// Alle Attribute in den Element-Baum übernehmen
foreach($wert->attributes() as $name => $value) {
// mit Ausnahme der ID, die ja bereits als Key existiert
if($name == "gleichesattribute") continue;
$data[$id][$name] = (string) $value;
}
}
// Zweite Datei durchgehen
foreach($xml2->wert as $wert) {
// und jedes Element anhand seiner ID (gleiches Attribut)
// in den Element-Baum einhängen, sofern noch nicht vorhanden
$id = (string) $wert['gleichesattribute'];
if(!isset($data[$id])) {
$data[$id] = array();
}
// Alle Attribute in den Element-Baum übernehmen
foreach($wert->attributes() as $name => $value) {
// mit Ausnahme der ID, die ja bereits als Key existiert
if($name == "gleichesattribute") continue;
$data[$id][$name] = (string) $value;
}
}
// Header für XML-Ausgabe senden
header("Content-type: application/xml");
// XML-Ausgabe generieren
echo '<root>';
// Für jedes Element im Element-Baum
foreach($data as $id => $record) {
// Den XML-Tag...
echo '<wert gleichesattribute="' . $id . '" ';
// ... mit allen Attributen generieren
foreach($record as $name => $value) {
echo $name . '="' . $value . '" ';
}
echo '/>';
}
echo '</root>';
?>
Eigentlich eine simple Sache - aber man benötigt eben PHP5 mit SimpleXML. ;-)
MfG, Dennis.