Majao: Inhalte auslesen

Hallo,
ich möchte gerne aus verschiedenen XML-Dokumenten Inhalte auslesen - im nachfolgenden Beispiel die Kurzbeschreibungen - die dann als HTML-Seite ausgegeben werden sollen.

Ausgangssituation:

Datei 1
<artikel>
  <kurzbeschreibung>...</kurzbeschreibung>
  <text>...</text>
</artikel>

Datei 2
<artikel>
  <kurzbeschreibung>...</kurzbeschreibung>
  <text>...</text>
</artikel>

Datei 3, 4, 5  ....

Ergebnis:

<div>
  <p style="kurzbeschreibung">...</p>
  <p style="kurzbeschreibung">...</p>
  Kurzbeschreibung 3, 4, 5  ....
</div>

Wenn alle Artikel in einer einzigen XML-Datei stehen, ist alles klar. Aber wie  muss die Transformation aussehen, wenn es getrennte Dateien sind?
Vielen Dank

M.

  1. Hallo Majao,

    ich möchte gerne aus verschiedenen XML-Dokumenten Inhalte auslesen - im nachfolgenden Beispiel die Kurzbeschreibungen - die dann als HTML-Seite ausgegeben werden sollen.

    Benutze XInlcude (Tutorial von zvon.org).

    Bis bald,
    Sascha

    1. Hallo,

      Benutze XInlcude (Tutorial von zvon.org).

      Auf zvon gibt es auch ein deutsches Tutorial. Dort wird ebenfalls inlude und zudem import behandelt (am Ende des Inhaltsverzeichnis).

      Bis bald,
      Sascha

      1. Ich glaube er sucht eher nach document()

        also

        <xsl:value-of select="document('datei_1.xml')/*[local-name() = 'artikel']/*[local-name() = 'kurzbeschreibung']"/>

        <xsl:value-of select="document('datei_2.xml')/*[local-name() = 'artikel']/*[local-name() = 'kurzbeschreibung']"/>

        1. Hallo,

          stimmt :(

          Bis bald,
          Sascha

          1. Ich glaube er sucht eher nach document()

            Ja und nein
            bei document() muss ich doch das Stylesheet jedes mal anpassen, wenn eine neue Datei dazukommt (bei 10 Dateien gibt es also 10 Anweisungen etc ...) Gibt es nicht eine Möglichkeit, über eine Schleife alle Datei zu erfassen und die Kurzbeschreibungen auszulesen?

            M.

            1. hmmm .... war die Frage zu dumm? oder zu schwer?

              1. Also du könntest es so machen:

                du generierst einen XML knoten irgendwo (vielleicht in seperate Datei source.xml) und editierst dort immer manuell, wenn ein neues dokument hinzukommt,

                <source>
                 <file href="place/file1.xml"/>
                 <file href="place/file2.xml"/>
                  .
                  .
                 <file href="place/fileX.xml"/>
                </source>

                damit könntest du dann eine Anweisung schreiben etwa

                <xsl:variable name="AllDocuments" select="document('source.xml')/source/file/@href"/>

                <xsl:for-each select="document($AllDocuments)/artikelbeschreibung/XXXXX">

                </xsl:for-each>

                Alternativ kann man das dynamisch machen, ich löse es etwa mit cocoon servlet auf einem tomcatserver, da kann man sich ein xml file mit dem aktuellen inhaltes eines verzeichnisses erstellen und dann die daten ähnlich dem obigen beispiel zugreifen, hat den vorteil, dass man das Verzeichnis ncht manuell pflegen lassen muss.

                1. Hallo
                  vielen Dank für die Antwort, wie ich sehe, muss man also immer - manuell oder dynamisch - eine Datei mit den entsprechenden Verweisen erstellen (dachte, man könnte direkt auf den Inhalt eines Verzeichnis zugreifen )

                  M.

        2. Ich glaube er sucht eher nach document()

          Ja und nein
          bei document() muss ich doch das Stylesheet jedes mal anpassen, wenn eine neue Datei dazukommt (bei 10 Dateien gibt es also 10 Anweisungen etc ...) Gibt es nicht eine Möglichkeit, über eine Schleife alle Datei zu erfassen und die Kurzbeschreibungen auszulesen?

          M.

          1. Hallo,

            Ja und nein
            bei document() muss ich doch das Stylesheet jedes mal anpassen, wenn eine neue Datei dazukommt (bei 10 Dateien gibt es also 10 Anweisungen etc ...) Gibt es nicht eine Möglichkeit, über eine Schleife alle Datei zu erfassen und die Kurzbeschreibungen auszulesen?

            Naja, wenn die Dateien fortlaufend nummeriert sind und Du Dir *sicher* bist, dass sobald eine Datei nicht existiert, alle darauffolgenden Dateien auch nicht existieren, dann kannst Du folgendes machen (ungetestet, die Funktionsweise sollte aber klar werden):

            <div>  
              <xsl:call-template name="kurzbeschreibung">  
                <xsl:with-param name="fileid" select="1" />  
              </xsl:call-template>  
            </div>
            

            Sowie der zusätzlichen Template:

            <xsl:template name="kurzbeschreibung">  
              <xsl:param name="fileid" />  
              <xsl:variable name="filename" select="concat('datei_', $file, '.xml')" />  
              <xsl:if test="doc-available($filename)">  
                <p style="kurzbeschreibung">  
                  <xsl:value-of select="doc($filename)/artikel/kurzbeschreibung" />  
                </p>  
                <xsl:call-template name="kurzbeschreibung">  
                  <xsl:with-param name="fileid" select="$fileid + 1" />  
                </xsl:call-template>  
              </xsl:if>  
            </xsl:template>
            

            Verzeichnisinhalte auslesen geht dagegen mit reinem XSLT nicht. Du kannst aber bei verschiedenen XSLT-Prozessoren durchaus eigene Funktionen "andocken", d.h. in einer anderen Sprache geschriebene Funktionen aus XSLT heraus aufrufen. Leider gibt es dafür keinen XSLT-Prozessor-übergreifenden Standard, weswegen es stark davon abhängt, welchen Prozessor du verwendest.

            Viele Grüße,
            Christian