John Barden: Pfad in einer Variable verwenden

Hi,

ich rufe in einer XSL-Datei ein Template auf. Dabei übergebe ich einen Pfad als Variable:
<xsl:with-param name="test_id" select="'daten/Struktur1/Tabelle1'"/>
Dieser Pfad ist bewusst in '', da der der Inhalt dieses Pfades erst in dem 2. Template gelesesn werden soll.

In dem 2. Template hole ich mir die Variable dann:
<xsl:param name="test_id"/>
Dann möchte ich den Pfad benutzen, um eine Variable (die hinter diesem Pfad steckt) aus der XML-Datei zu holen:
<xsl:value-of select="$test_id"/>
Als Ausgabe bekomme ich dann aber nur das:
daten/Struktur1/Tabelle1
Unter "daten/Struktur1/Tabelle1" in der XML-Datei steht aber etwas ganz anderes (eine Zahl). Wenn ich es oben ohne die '' in das Selekt reinschreibe, dann liest er es direkt von dort aus, wo er oben steht. Dann bekomme ich wieder eine andere Zahl, da es oben das falsche Template ist.

Wie kann ich das übergeben, damit es funktionert?

Danke für alle Hilfen

Gruß
John

  1. Hallo,

    ich rufe in einer XSL-Datei ein Template auf. Dabei übergebe ich einen Pfad als Variable:
    <xsl:with-param name="test_id" select="'daten/Struktur1/Tabelle1'"/>
    Dieser Pfad ist bewusst in '', da der der Inhalt dieses Pfades erst in dem 2. Template gelesesn werden soll.

    Das kann nicht wirklich gehen, es sei denn du bist in einem recursiven Tempalte.
    Wenn du versucht den Wert einer Variable die in einem Template definiert ist, in einem anderen Template aufzurufen, bekommst du eine Fehlermeldung, dass die Variable (im 2. Template )nicht definiert ist.

    Beim Parameter kannst du im gegensatz zu Variable den Wert ändern, deshalb kann man ja eben mit xsl:with-param einen anderen Wert dem Paramter zuweisen.
    Trotzdem gilt hier das selbe wie bei Variablen, die Wirkungsbereich der Variable / des Prameters muss stimmen.

    In dem 2. Template hole ich mir die Variable dann:
    <xsl:param name="test_id"/>

    Für mich definierst du erst hier eigentlich deinen Parameter.

    <xsl:value-of select="$test_id"/>
    Als Ausgabe bekomme ich dann aber nur das:
    daten/Struktur1/Tabelle1
    Unter "daten/Struktur1/Tabelle1" in der XML-Datei steht aber etwas ganz anderes (eine Zahl).

    Ist logeisch, nach dem du mit select"'blabla'" einfach einen String erzeugt hast.

    »»Wenn ich es oben ohne die '' in das Selekt reinschreibe, dann liest er es direkt von dort aus, wo er oben steht. Dann bekomme ich wieder eine andere Zahl, da es oben das falsche Template ist.

    Wie kann ich das übergeben, damit es funktionert?

    Übergehen kannst du es nicht. Es funktioniert alles so wie es soll.
    Du muss deine Templates umarbeiten, oder dir deine Parameters anders definieren.
    Bzw. auf Grund der von dir gelieferten Infos, sehe ich keine andere Lösung.

    Grüße
    Thomas

    1. Ah, danke für die Antwort. Stimmt schon, es funktioniert ja eigentlich wie es soll.

      Das Problem ist das:
      Ich habe ein Template. Das liest bestimmte Sachen aus der XML-Datei. Aber dieses Template soll nicht statisch sondern dynamisch sein. Es soll fähig sein, verschiedene bestimmte Sachen aus der XML-Datei zu lesen. Und das, was er lesen soll, das möchte ich ihm per with-param übergeben. Also den Pfad.
      Gäbe es da vielleicht noch eine andere Möglichkeit? Oder ist es überhaupt nicht mögich?

      1. Hallo,

        Das Problem ist das:
        Ich habe ein Template. Das liest bestimmte Sachen aus der XML-Datei. Aber dieses Template soll nicht statisch sondern dynamisch sein. Es soll fähig sein, verschiedene bestimmte Sachen aus der XML-Datei zu lesen. Und das, was er lesen soll, das möchte ich ihm per with-param übergeben. Also den Pfad.
        Gäbe es da vielleicht noch eine andere Möglichkeit? Oder ist es überhaupt nicht mögich?

        So einfach kann ich darauf weder mit ja noch mit nein antworten. Dazu müsste ich dein XML und XSL sehen um genau zu verstehen was du erreichen möchtest.

        Grüße
        Thomas

        1. Ok, meinst du es wäre vielleicht so möglich, dass ich oben eine Variable definiere, die einen Pfad enthält, der dann unten in einem Template ausgelesen wird? z. B. so:
          <xsl:variable name="id1">daten/testdaten/id1</xsl:variable>

          <xsl:template match="/">
            <xsl:value-of select="$id1"/>
          </xsl:template>

          im Value of steht dann nur der Pfad daten/testdaten/id1. Kann ich die Variable nicht irgendwie so übergeben, dass ich dann den Inhalt vom Pfad bekomme, nicht den Pfad selbst?

          1. Ok, ich hab nochmal ein vereinfachtes Beispiel gemacht.
            test1.xml:
            -----------------------------------------------------
            <?xml version="1.0" encoding="ISO-8859-1"?>
            <?xml-stylesheet type="text/xsl" href="test1.xsl"?>

            <data>
             <test1>1</test1>
             <test2>2</test2>
            </data>
            -----------------------------------------------------

            test1.xsl:
            -----------------------------------------------------
            <?xml version="1.0" encoding="utf-8"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output method="html" encoding="UTF-8" indent="yes"/>

            <xsl:variable name="path">data/test2</xsl:variable>

            <xsl:template match="/">

            <html>
            <head>
            <title>test1</title>
            </head>
            <body>

            <xsl:value-of select="$path"/>

            </body>

            </html>

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

            An der Stelle <xsl:value-of select="$path"/> sollte er "2" ausgeben. Aber er gibt "data/test2" aus.

            Gibt es eine Möglichkeit, dass nicht den Inhalt der Variable $path ausgibt, sondern da reinschaut, und das ausgibt, was an der Stelle in der XML-Datei steht?

            1. Hallo,

              Ok, ich hab nochmal ein vereinfachtes Beispiel gemacht.

              OK, aber wenn ich deine frühere Pstings richtig verstanden haben, ist es etwas mehr, als du es hier im Beispiel darstellst.

              <xsl:variable name="path">data/test2</xsl:variable>
              <xsl:value-of select="$path"/>

              An der Stelle <xsl:value-of select="$path"/> sollte er "2" ausgeben. Aber er gibt "data/test2" aus.

              Ja, das ist das erwartete und beabsichtigte Verhalten.

              Gibt es eine Möglichkeit, dass nicht den Inhalt der Variable $path ausgibt, sondern da reinschaut, und das ausgibt, was an der Stelle in der XML-Datei steht?

              <xsl:variable name="path" select="data/test2" />

              Aber, wie gesagt, wenn ich dich richtig verstanden habe, dann möchtest du den Wert dieser Variablen dynamsich vergeben und dass wird leider nicht gehen.

              Grüße
              Thomas

              1. Jemand aus einem anderen Forum hat mir einen Lösungsvorschlag gemacht, der zwar wunderbar funktioniert, aber eben leider nur im IE. Da ich es plattformunabhängig brauche, bringt mir das wenig. Entweder gibt es so etwas auch für andere Browser, oder ich kann es leider nicht verwenden.

                So sieht das XSL aus. Sagt dir das was?

                <?xml version="1.0" encoding="utf-8"?>
                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:user="http://mycompany.com/mynamespace"
                extension-element-prefixes="msxsl user">
                <xsl:output method="html" encoding="UTF-8" indent="yes"/>
                <msxsl:script language="JScript" implements-prefix="user">
                 function evaluate(context, xpath) {
                  return context.nextNode().selectNodes(xpath);
                 }
                </msxsl:script>

                <xsl:variable name="path" select="'data/test1'"/>

                <xsl:template match="/">

                <html>
                <head>
                <title>test2</title>
                </head>
                <body>

                <xsl:value-of select="user:evaluate(., $path)"/>

                </body>

                </html>

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

                1. Hallo,

                  So sieht das XSL aus. Sagt dir das was?

                  Ja, das sagt mir genau das was es dir auch gesagt hat: es funktioniert nur mit dem IE.

                  Ich habe dir deshalb nichts über Extensionen gesagt, weil ich nicht alle Parser und ihre Extensionen kenne ;-).
                  Mit XSLT 2.0 könntest du auch "experimentieren", da wäre mögich z.B. dass du das Ergebnis von temporären Teilbäumen als Variable verwendest.
                  (Nachteil xslt 2.0 ist erst WD und die Implemtierungen sind dementsprechend experimentell)

                  Mir fällt keine andere Lösung ein, aber vielleicht lohnt sich ein Blick in die Doku deines Parsers, ob und welche Extensionen er bietet.

                  Grüße
                  Thomas