fjh: Elemente aus zwei XML Dateien zusammenführen.

Beitrag lesen

Hallo Sönke,

Da ich mich erst seit kurzen mit XML, XSLT und Co. beschäftige verzeiht mir meine Anfängerfrage.

schon geschehen ;-)

Ich hatte mir erst gedacht das dies eventuell über die document()-Funktion machbar wäre.

Ja, das ist auch der richtige Weg.

Also habe ich mir das zweite XML Dokument zunächst einmal in eine Variable geladen.

Bsp:
  <xsl:variable name="sitemap_doc" select="document('sitemap.xml', /restauratrix/inhalt)" />

So ist das nicht richtig. Was Du ja möchtest ist, alle Kindelemente von <inhalt> in die Variable lesen, also eine Knotenmenge zurückbekommen. Dazu musst du es anders schreiben:

<xsl:variable name="sitemap_doc" select="document('sitemap.xml')/restauratix/inhalt"/>

Die Variable enthält nun eine Knotenmenge (alle Kinder von <inhalt> im Dokument "sitemap_doc") und du kannst diese Variable nutzen, um in dieser Knotenmenge weiter zu navigieren.

Du kannst natürlich auch das gesamte Dokument laden, indem Du einfach nur schreibst:
<xsl:variable name="sitemap_doc" select="document('sitemap.xml')"/>.

Die Funktion document() gibt immer eine Knotenmenge zurück, die _einen_ Knoten enthält, nämlich den Wurzelknoten (Root-Knoten) des zu ladenden XML-Dokuments. Dieser Knoten enthält dann alle Elemente des Dokuments.

Wie komme ich jetzt aber an die Element-Knoten innerhalb der Variable heran?? Versuche wie... select="$sitemap_doc/element_a/element_b" funktionieren (natürlich) nicht.

Doch, mit <xsl:value-of select="$sitemap_doc/element_a/element_b"/> erreichst Du Dein Ziel, wenn Du die Variable richtig mit einer Knotenmenge als Wert belegst.

Kann es sein das ich gerade dabei bin die document()-Funktion für etwas zu mißbrauchen für das sie garnicht gedacht ist?

Nein, Du Dein Ansatz war genau richtig.

Zum Verständnis nochmal ein einfaches Beispiel, dass funktioniert. Ausgegeben wird einfach der Inhalt des Elements <ausgabe> aus einer über die document()-Funktion geladenen Datei (doctest.xml). Die erste XML-Datei dient nur zum Aufruf des Stylesheets.

=====XML-Datei 1=====
<?xml version="1.0"?>

<?xml-stylesheet href="doc_test.xsl" type="text/xsl"?>

<ausgabe>
  <test>Egal was hier steht</test>
</ausgabe>

========XML-Datei 2 (doctest.xml)==========
<?xml version="1.0"?>
<ausgabe>
  <pfad>ausgabe/test</pfad>
</ausgabe>

=========XSLT-Stylesheet=========
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="pfadangabe" select="document('doctest.xml')/ausgabe"/>

<xsl:template match="/">
    <html>
       <head>
         <title>Die document()-Funktion von XSLT!</title>

</head>
       <body>
         <xsl:value-of select="$pfadangabe/pfad"/>

</body>
     </html>
  </xsl:template>

</xsl:stylesheet>

Gruß
Franz