Sönke: Elemente aus zwei XML Dateien zusammenführen.

Moin!

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

Folgende Sache. Während ich mit XSLT ein XML Dokument transformiere (nach XHTML) würde ich gerne aus einem zweiten, anderen XML Dokument einige Elemente importieren und diese mit in die Transformation einfließen lassen.
Kurz gesagt ich möchte gerne aus zwei XML Dokumenten
Informationen entnehmen und daraus ein XHTML Dokument erzeugen.

Die Schwierigkeit dabei ist natürlich: "Wie geht das?"
Ich hatte mir erst gedacht das dies eventuell über die document()-Funktion machbar wäre. 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)" />

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. Kann es sein das ich gerade dabei bin die document()-Funktion für etwas zu mißbrauchen für das sie garnicht gedacht ist?
Wenn ja, wie schaffe ich mein Vorhaben dann? Eventuell vor der eigentlichen Transformation der XML Daten nach XHTML die beiden XML Dateien zunächst über eine weitere XSLT in ein Dokument wandeln?

Viele Grüße,
Sönke

  1. 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

    1. Hallo Franz!

      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"/>

      Oh nein! So ein §*%")&$. Stimmt! Ist ja auch völlig logisch. Da hatte ich wohl mehr als nur ein Brett vor dem Kopf. Jetzt kapiere ich auch endlich was das mit den zweiten Parameter von document() wirklich auf sich hat.

      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.

      Wenigsten da lag ich richtig. :)

      Wirklich vielen Dank für Deine sehr gute und ausführliche Hilfe. Ich war schon kurz davor die dümmsten Dinge auszuprobieren. :|

      Gruß,
      Sönke