markus: Parameteruebergabe an XSL

hallo leute,

kann man beim aufruf einer xml datei auch parameter uebergen, die dann von der xslt-datei gelesen werden koennen?
mein problem:
habe eine dtd wo ein element page definiert ist. dieses elemnt enthaelt wieder andere elemente. ich moechte realisieren, dass jeweils nur die informationen eines page-elementes angezeigt werden und dass aber gleichzeitig auch eine navigation generiert wird wo fuer jede page ein link vorhanden ist. es wird quasi immer die gleiche xml-datei aufgerufen, nur eben mit einem parameter wo festgelegt ist, welches page element angezeigt werden soll.

meine dtd:

<!ELEMENT fotobook (page)*>
<!ELEMENT page (entry | id)*>
<!ELEMENT entry (image | text | date)*>
<!ELEMENT image (image_url | image_desc)*>
<!ELEMENT image_url (#PCDATA)>
<!ELEMENT image_desc (#PCDATA)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT id (#PCDATA)>

besten dank und gruss, def

  1. Hallo,

    kann man beim aufruf einer xml datei auch parameter uebergen, die dann von der xslt-datei gelesen werden koennen?

    Ja, in der URL.

    mein problem:
    ich moechte realisieren, dass jeweils nur die informationen eines page-elementes angezeigt werden

    z.B. URL : http://www.domain.de/datei.xml?page=p123

    in der XSL Datei (nur skizziert!):

    <xsl:param name="page" select="''" />
    ...
    <xsl:apply-templates select="page[@id = $page]" />

    »»und dass aber gleichzeitig auch eine navigation generiert wird wo fuer jede page ein link vorhanden ist.

    <xsl:template match="page" mode="navigation>
    <a href="datei.xml?page={@id}">
     <xsl:value-of select=" .... "/>
    </a>
    </xsl:template>

    aufruf:
    <xsl:apply-templates mode="navigation" />

    Grüße
    Thomas

    1. he thomas,

      vielen dank für die antwort. dank deiner codebeispiele hab ich die navigation und so hinbekommen und er selektiert auch die richtigen einträge aus der entsprechenden 'page', nur den übergebenen parameter liesst er nicht ein?

      das ist doch der dazugehörige aufruf, oder?

      <xsl:param name="page" select="''" />

      für select setze ich dann 1 (default). leider stellt er dann immer die einträge aus seite 1 dar, auch wenn ich www.blabla.de/datei.xml&page=2 als url aufrufe.

      [
       <xsl:param name="XXX" select="''" />
       www.blabla.de/datei.xml$YYY=2
       muss XXX gleich YYY sein?
      ]

      sorry, hab gestern angefangen mich mit dem kram zu beschäftigen und seh noch nicht ganz durch.

      danke und gruss, markus

      1. Hi,

        für select setze ich dann 1 (default). leider stellt er dann immer die einträge aus seite 1 dar, auch wenn ich

        www.blabla.de/datei.xml&page=2 als url aufrufe.
                               ^
        ? trennt den Query-String von der URL, & trennt die einzelnen Parameter

        <xsl:param name="XXX" select="''" />
        www.blabla.de/datei.xml$YYY=2
        muss XXX gleich YYY sein?

        Wenn es sich um den Parameter des selben Namen handeln soll: ja.
        Und statt $ natürlich ?, siehe oben.

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
        1. hi,

          ich raffs nicht.

          hier mein code:

          <?xml version="1.0" encoding="iso-8859-1"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

          <!--
          hier weise ich der variablen pageID den im URL übergebenen wert zu.
          !-->
          <xsl:param name="pageID" select="'1'" />

          [...]

          <xsl:for-each select="fotobook/page">

          <!--
          und hier frage ich die variable ab.
          !-->

          <xsl:if test="id = $pageID">
                 <xsl:for-each select="entry">

          [...]

          </xsl:template>
          </xsl:stylesheet>

          die if-abfrage haut hin, aber er benutzt halt immer den default wert, der oben in <xsl:param name="pageID" select="'1'" /> zugewiesen wird.

          der URL sieht folgendermassen aus: www.blabla.de/data.xml?pageID=1

          wo liegt der fehler???

          danke, markus

      2. Hallo Markus,

        nur den übergebenen parameter liesst er nicht ein?

        das ist doch der dazugehörige aufruf, oder?

        <xsl:param name="page" select="''" />

        für select setze ich dann 1 (default). leider stellt er dann immer die einträge aus seite 1 dar, auch wenn ich

        www.blabla.de/datei.xml&page=2 als url aufrufe.

        an der ersten stelle bitte nicht & sonder ? verwenden
        www.blabla.de/datei.xml?page=2&andereprameter=anderewert&usw=usf

        Ich gehe davon aus, dass du dein XML serverseitig verarbeitest: machst du ein dirket im Browser (IE oder Mozialle) geht das nicht, sie (bzw. deren Parser) können keine Parameter aus URLs verarbeiten.

        [
         <xsl:param name="XXX" select="''" />
         www.blabla.de/datei.xml$YYY=2
         muss XXX gleich YYY sein?
        ]

        Ja es muss. Du muss den Namen des Parametes übergeben, wenn du im XSL den Paramternamen mit XXX bestimmt hast und in der URL YYY als Parametername übergibst, wird das nicht erkannt denn du hast YYY in deinem XSL nicht definiert.

        Grüße
        Thomas

        1. hallo,

          Ich gehe davon aus, dass du dein XML serverseitig verarbeitest: machst du ein dirket im Browser (IE oder Mozialle) geht das nicht, sie (bzw. deren Parser) können keine Parameter aus URLs verarbeiten.

          ich dachte das die browser das können. mhm, dann wird das wohl der grund sein, warum es nicht funzt.

          was muss gegeben sein, dass das xml serverseitig verarbeitet werden kann? also erst mal muss ich nen server finden der das macht nehm ich an (logikbonus...) und muss ich dann auch die dateien, also datei.xml, datei.dtd und datei.xsl irgendwie anpassen, dass die serverseitig verarbeitet werden können?

          schon mal vielen dank für die nette hilfe bis hierher. hat mir auf jeden fall weitergeholfen.

          beste grüsse, markus

          1. Hallo Markus,

            ich dachte das die browser das können. mhm, dann wird das wohl der grund sein, warum es nicht funzt.

            Vielleicht Version 9.04 der Browser wird das machen.

            was muss gegeben sein, dass das xml serverseitig verarbeitet werden kann? also erst mal muss ich nen server finden der das macht nehm ich an (logikbonus...) und muss ich dann auch die dateien, also datei.xml, datei.dtd und datei.xsl irgendwie anpassen, dass die serverseitig verarbeitet werden können?

            Alle wege führen - angeblich - nach Rom, zumindest aber irgendwohin:
            Serverseitig ginge es

            • mit APS und installiertem MSXML am Server.
            • mit PHP und installiertem Sablotron am Server
            • mit Apache, Tomcat (oder einem anderen Servlet Engine) und installiertem Cocoon am Server
            • mit einem beliebigen XML und XSL Parser die am Server installiert sind.

            An deiner Dateien muss du eigentlich kaum bis nichts ändern.

            Grüße
            Thomas

            PS: es wäre u.U. auch möglich, dass du JavaScript und DOM (nur mit dem IE) verwendest um eine Variable dem XSL-Sheet übergibst, dazu gibt es schon viele Beiträge von Thomas Meineke im Archiv.