[XSLT] werte zweier XML Dateien in einem Stylesheet aufrufen und verarbeiten

Bexx

Verrückte Erfinderin bei Daniel Düsentrieb
Hi nochmal,

ich habe eine kleine Schwierigkeit gefunden im Umgang mit XSLT.
Und zwar, ich habe 2 XML. Diese möchte ich beide über dasselbe XSLT manipulieren. Aus der 1. XML möchte ich eine bestimmte Knotenmenge mit copy-of kopieren, anschließend die 2. XML aufrufen und in einen bestimmten Knoten meine kopierte Knotenmenge aus der 1. XML einfügen. Nur leider kenne ich bislang nur Grundlagen in XSLT und weiß nicht wie der Aufruf syntaktisch lauten muss. Ich lese neben Tutorials, aber dazu habe ich leider bisher nichts gefunden. Speichere ich meine kopierte Knotenmenge zunächste in ein <xsl:variable> Tag oder kann ich das irgendwie direkt mit der document() Funktion?

Danke im Voraus,
die, die mal wieder Hilfe braucht ;)
 
Zuletzt bearbeitet:
die Document Funktion kann ich ja anwenden, aber ich kenne die Syntax nicht, wie sie in XSLT sein muss, um zu meinem Ziel zu kommen - darin liegt mein Problem..
Ich habe diese besagten zwei XML und meine Problematik ist einfach das ich keinen Anfang finde!

SOURCE_XML beinhaltet mehrere Knotensets vom selben Typ NODEXY
ich soll checken ob ein bestimmtes Childelement aller NODEXY Knoten
übereinstimmt mit einem bestimmten Childelement von NODEXX im DESTINATION_XML.
IF TRUE soll NODEXY mit allen Childs in die DESTINATION_XML in einen bestimmten Childnode von NODEXX kopieren.

Das ist die Aufgabe. Ich stelle mich viell etwas dämlich an, aber ich weiß wirklich nicht wie ich ansetzen soll. Mir fehlt Zeit die Syntax jetzt noch schnell besser kennenzulernen wegen Abgabedruck und ich komm so gut wie nicht voran :( ich will ja keinen fertigen SOurceCode hier hingepostet bekommen, alles wonach ich frage ist eine Anleitung, damit ich mich Schritt für Schritt reinarbeiten kann...
 
Zuletzt bearbeitet:
Mach bitte mal ein Beispiel wie das erste und das zweite XML-Dokument aussehen könnte und wie das Ergebnis aussehen soll.
 
Beide Dateien haben in etwa den Aufbau und die ZielXML soll eigentlich so bleiben wie sie ist, mit Ausnahme der Knotensets die nach gefundener Übereinstimmung hinzugefügt werden sollen..

XML:
<custom:ShipmentAssignmentDefinition>
	<data>
		<evenMoreData>
			<dta>
			 .
			 .
			 .
			 .
			</dta>
		</evenMoreData>
		<someMoreData>
			<daa> bla bla </daa>
			.
			.
			.
			.
			.
		</someMoreData>
		<somethingElse>
			<again>
				.
				.
				<littleMore>
					.
					<DerAuszulesendeWert> blablubb </DerAuszulesendeWert>
					.
				</littleMore>
			</again>
			.
			.
			.
			.
		</somethingElse>
		.
		.
	</data>
	<data>
		<evenMoreData>
			<dta>
			 .
			 .
			 .
			 .
			</dta>
		</evenMoreData>
		<someMoreData>
			<daa> bla bla </daa>
			.
			.
			.
			.
			.
		</someMoreData>
		<somethingElse>
			<again>
				.
				.
				<littleMore>
					.
					<DerAuszulesendeWert> blablubb </DerAuszulesendeWert>
					.
				</littleMore>
			</again>
			.
			.
			.
			.
		</somethingElse>
		.
		.
	</data>	
	<data>
		<evenMoreData>
			<dta>
			 .
			 .
			 .
			 .
			</dta>
		</evenMoreData>
		<someMoreData>
			<daa> bla bla </daa>
			.
			.
			.
			.
			.
		</someMoreData>
		<somethingElse>
			<again>
				.
				.
				<littleMore>
					.
					<DerAuszulesendeWert> blablubb </DerAuszulesendeWert>
					.
				</littleMore>
			</again>
			.
			.
			.
			.
		</somethingElse>
		.
		.
	</data>	
usw....
 
Zuletzt bearbeitet von einem Moderator:
...
SOURCE_XML beinhaltet mehrere Knotensets vom selben Typ NODEXY
ich soll checken ob ein bestimmtes Childelement aller NODEXY Knoten
übereinstimmt mit einem bestimmten Childelement von NODEXX im DESTINATION_XML.
IF TRUE soll NODEXY mit allen Childs in die DESTINATION_XML in einen bestimmten Childnode von NODEXX kopieren.
...
Hallo,

dein Beispiel ist ist weder wohlgeformt noch hilfreich. In deiner Aufgabenstellung ist dreimal das Adjektiv "bestimmte(s/n)" enthalten, für das man ebenso "irgendein" schreiben könnte. Abgesehen davon ist auch unklar, nach welchen Kriterien die Kindknoten "übereinstimmen" sollen. Hier eine triviale Lösung, aus der wenigstens hervorgehen soll wie die document()-Funktion verwendet werden kann.

Die XML-Datei, die die Adressreferenz beider XML-Dokumente liefert und Quelle für die Transformation ist:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<files>
	<file href="file1.xml"/>
	<file href="file2.xml"/>
</files>
Stylesheet:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/files">
    <xsl:variable name="nodes1" select="document(file[1]/@href)/node()" />
    <xsl:variable name="nodes2" select="document(file[2]/@href)/node()" />

    <result>
      <!-- Ausgabe aller Kindknoten der Elemente mit Namen "NODEXX" von "$nodes1",
         die selbst keine Kindknoten haben und mindestens einmal in $nodes2 als
         Kind des Elements "NODEXY" vorkommen. Verglichen wird nur der Elementinhalt,
         Namen der Kindknoten und Attribute sind beim Vergleich irrelevant. -->
      <xsl:copy-of select="$nodes1//NODEXX/*[self::* = $nodes2//NODEXY/* and not(*)]" />
    </result>

  </xsl:template>

</xsl:stylesheet>
... ich will ja keinen fertigen SOurceCode hier hingepostet bekommen, alles wonach ich frage ist eine Anleitung, damit ich mich Schritt für Schritt reinarbeiten kann...
Ich fand das XSLT-Kochbuch gut, vielleicht ist es auch was für dich. Hier ein Probekapitel, das sogar dein Problem tangiert.
 
Zuletzt bearbeitet von einem Moderator:
Danke, ich weiß ich habs nicht einfacher gemacht mit meiner Erklärung, aber alles so abzuändern, dass ich es hier posten kann, wäre echt ne Schweinearbeit gewesen, tut mir leid.
danke dir, dass du dir die Mühe für das Beispiel gemacht hast, es hilft bei dem ein oder anderen weiter jetzt :)
 
Zurück