norbert: document()

Hallo Alle,
ich bin Anfaenger und blicke Folgendes nicht:

Mein xsl-Doku sieht ungefaehr folgendermassen aus:

<xsl:template match="Pfad/Pfader/AmPfadesten">

xsl:textxyz</xsl :text>

<xsl:call-template name="formatiere">
<xsl:with-param name="wert" select="Noch/Mehr/Pfade"/>
<xsl:with-param name="laenge" select="'2'"/>
</xsl:call-template>

<xsl:call-template name="formatiere">
<xsl:with-param name="wert" select="Wert/aus/externem/Dokument"/>
<xsl:with-param name="laenge" select="'2'"/>
</xsl:call-template>

Wie oder wo oder wie und wo binde ich das externe xml-Doku ein, um im zweiten call-template meinen Pfade reinzutun?
:-/  Ist mein Problem verstaendlich geworden?
Dank und Gruss, Norbert

  1. Hallo Norbert,

    Wie oder wo oder wie und wo binde ich das externe xml-Doku ein, um im zweiten call-template meinen Pfade reinzutun?
    :-/  Ist mein Problem verstaendlich geworden?

    Wie du bereits im Titel richtig vermutet hast, über die document()-Funktion von XSLT. Die Funktion gibt dir das Root-Element des externen Dokuments zurück. Mittels XPath-Syntax kannst du dann von diesem Root aus weiter durch das Node-Set (also das externe Dokument in Baum-Form) navigieren. Ein möglicher Parameter der document()-Function ist ein String, der den Pfad zu deiner externen XML-Datei angibt.

    Also auf dein Beispiel übertragen:

    <xsl:call-template name="formatiere">
    <xsl:with-param name="wert"
      select="document('PfadzuDeinerDatei')/Wert/aus/externemDokument"/>
    <xsl:with-param name="laenge" select="'2'"/>
    </xsl:call-template>

    Gruß
    Franz

    1. Also auf dein Beispiel übertragen:

      <xsl:call-template name="formatiere">
      <xsl:with-param name="wert"
        select="document('PfadzuDeinerDatei')/Wert/aus/externemDokument"/>
      <xsl:with-param name="laenge" select="'2'"/>
      </xsl:call-template>

      Gruß
      Franz

      Eine Frage noch:
      Wenn die "externe" XML-Datei im gleichen Ordner liegt, wie die xsl-Dateien und das Haupt- XML-File - reicht es dann aus, in
      ('PfadzuDeinerDatei') den Namen des XML-Dokumentes anzugeben?
      Danke fuer die Antwort,
      Gruss, Norbert

      1. Hi,

        Eine Frage noch:
        Wenn die "externe" XML-Datei im gleichen Ordner liegt, wie die xsl-Dateien und das Haupt- XML-File - reicht es dann aus, in
        ('PfadzuDeinerDatei') den Namen des XML-Dokumentes anzugeben?

        ja.

        Gruß
        Franz

        1. Hmmm... es klappt nicht. Ich bekomme keine Fehlermeldung, es erscheint aber nur "gaehnende Leere", wo eigentlich ein Text auftauchen sollte?!
          Was laeuft denn jetzt falsch??
          Gruss, Norbert

          1. Hallo,

            Hmmm... es klappt nicht. Ich bekomme keine Fehlermeldung, es erscheint aber nur "gaehnende Leere", wo eigentlich ein Text auftauchen sollte?!
            Was laeuft denn jetzt falsch??

            der gesucheter node existiert nicht (der 'select' verfehlt das ziel)?

            (welchen prozessoer benutzt du?)

            bsp:
            dateien sind für cocoon (xalan) aufbereitet.

            ----xml 1 ----
            <?xml version="1.0"?>
            <?xml-stylesheet href="document_01.xsl" type="text/xsl"?>
            <?cocoon-process type="xslt"?>

            <ROOT>
               <DATA>
                  <NAME>Huber</NAME>
                  <VORNAME>Andreas</VORNAME>
                  <ID>64</ID>
               </DATA>
               <DATA>
                  <NAME>Meier</NAME>
                  <VORNAME>Matthias</VORNAME>
                  <ID>23</ID>
               </DATA>
                  <DATA>
                  <NAME>Huber</NAME>
                  <VORNAME>Matthias</VORNAME>
                  <ID>22</ID>
               </DATA>
            </ROOT>
            -----
            ------ xml 2 -----
            <?xml version="1.0"?>
            <wurzel>
               <code>123-code-456</code>
            </wurzel>
            ------
            ---- xsl ------
            <?xml version='1.0'?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

            <xsl:template match="ROOT">
            <xsl:processing-instruction name="cocoon-format">type="text/html"</xsl:processing-instruction>
            <html>
             <head>
              <title>funktion: document()</title>
             </head>
             <body>

            <xsl:for-each select="DATA">
            <p>
            <b><xsl:value-of select="NAME" /></b>&#160;
            <i><xsl:value-of select="VORNAME" /></i>&#160;
            <xsl:call-template name="formatiere">
               <xsl:with-param name="wert" select="document('document_02.xml')/wurzel/code"/>
            </xsl:call-template>
            &#160;&#160;
            <u>
            <xsl:call-template name="formatiere">
               <xsl:with-param name="wert" select="ID"/>
            </xsl:call-template>
            </u>

            </p>
            </xsl:for-each>

            <div>

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

            <xsl:template name="formatiere">
            <xsl:param name="wert" />
            <i>
            <xsl:value-of select="$wert" />
            </i>
            </xsl:template>

            </xsl:stylesheet>
            ------

            erzeugte html:
            ---
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
            <html><head><title>funktion: document()</title></head><body><p><b>Huber</b> 
            <i>Andreas</i> 
            <i>123-code-456</i>
              
            <u><i>64</i></u></p><p><b>Meier</b> 
            <i>Matthias</i> 
            <i>123-code-456</i>
              
            <u><i>23</i></u></p><p><b>Huber</b> 
            <i>Matthias</i> 
            <i>123-code-456</i>
              
            <u><i>22</i></u></p><div></div></body></html>
            -------

            grüße
            thomas

            1. Jau - hat geklappt! Vielen Dank an Euch beide!
              Gruss, Norbert