Mirco: XPath aus xml:param zusammensetzen

Hi.

Ich möchte in meinem XSL einen bestimmten Wert aus der XML-Datei verwenden.
Die XML-Datei wird komplett dynamisch erzeugt. Im Anschluß daran wird die <stringtable> noch reinkopiert:

<root x="entry2">
...
 <stringtable>
  <entry1>
   <e id="1">...</e>
   <e id="2">...</e>
  </entry1>
  <entry2>
   <e id="1">...</e>
   <e id="2">...</e>
  </entry2>
  <entry3>
   <e id="1">...</e>
   <e id="2">...</e>
  </entry3>
 </stringtable>
</root>

In der XSL-Datei möchte ich nun folgendes machen.
<xsl:param name="x" select="root/@x"/>
<xsl:param name="pfad" select="root/stringtable/$x"/>

um dann mittels

<xsl:value-of select="$pfad/e[@id=2]" />

den wert aus "root/stringtable/entry2/e" zu lesen, bei dem "id=2" ist.

d.h., wie genau die select-Anweisung heißen muss, entscheidet sich erst, nachdem das XML-File erzeugt wurde - also immer erst unmittelbar vorm aufruf des XSLT-Prozessors.

Allerdings beschleicht mich das Gefühl, dass Konstrukte wie 'select="root/stringtable/$x"' nicht funktionieren. Hat einer von euch einen Hinweis, wie man so ein select erstellt?

Gruß,
Mirco

P.S.: Ja, das ist dazu gedacht, um unterschiedliche Sprachen zu unterstützen (deshalb auch Stringtable). Vermutlich gibt es dafür viel bessere Konzepte?!? Stuck my nose into it if you like...

  1. Hallo,

    <root x="entry2">
    In der XSL-Datei möchte ich nun folgendes machen.
    <xsl:param name="x" select="root/@x"/>

    Das liefert dann einen String.

    <xsl:param name="pfad" select="root/stringtable/$x"/>

    Der gelieferter Sting bleibt String und nicht ein Knoten.
    <xsl:param name="pfad" select="root/stringtable/*[name() = $x]"/>

    um dann mittels

    <xsl:value-of select="$pfad/e[@id=2]" />

    Das wäre dann möglich.

    Allerdings beschleicht mich das Gefühl, dass Konstrukte wie 'select="root/stringtable/$x"' nicht funktionieren.

    Wenn man bestimmte Sachen beachtet, funktioniert sowas schon.

    Grüße
    Thomas

    1. <xsl:param name="pfad" select="root/stringtable/*[name() = $x]"/>

      Ja, super! Genau so funktioniert es. Dankeschön.
      (Ich muss aber gestehen, dass ich den * da nicht hingesetzt hätte. Hmm, über den Grund muss ich wohl noch mal nachdenken...)

      Viele Grüße,
      Mirco

      1. Hallo,

        <xsl:param name="pfad" select="root/stringtable/*[name() = $x]"/>

        Ja, super! Genau so funktioniert es. Dankeschön.
        (Ich muss aber gestehen, dass ich den * da nicht hingesetzt hätte. Hmm, über den Grund muss ich wohl noch mal nachdenken...)

        Der * bezeichent in diesem Ausdruck ein beliebiges Kindelement vom <stringtable>, d.h. es werden alle Kindelemente ausgewählt. Im Predikat ([]) wird aber gesagt, dass ein Kindelement nur dann ausgewählt werden soll, wenn dessen Name  = $x ist.

        Grüße
        Thomas

        1. Hi,

          Der * bezeichent in diesem Ausdruck ein beliebiges Kindelement vom <stringtable>, d.h. es werden alle Kindelemente ausgewählt. Im Predikat ([]) wird aber gesagt, dass ein Kindelement nur dann ausgewählt werden soll, wenn dessen Name  = $x ist.

          Ach so, ich dachte, dass die Suche bei der Angabe von Prädikaten implizit über alle Kindelemente iteriert. Deshalb habe ich mich über den * gewundert. Vielen Dank für deine Zeit (und dein knowhow).

          Gruß,
          Mirco