bearli: Variableninhalt soll neuer Variablenname werden

Hi,

also, es geht um folgendes:

Ich habe ganz viele verschiedene Variablen mit den Namen e01, e02, e03 und so weiter, welche der Reihe nach in einzelnen Tabellenzellen ausgegeben werden sollen.

Manuell sieht das bei mir so aus:

          <xsl:variable name="e01">  
            <xsl:value-of select="name(@*[contains(.,'e01')])"/>  
          </xsl:variable>  
          <xsl:variable name="e02">  
            <xsl:value-of select="name(@*[contains(.,'e02')])"/>  
          </xsl:variable>  
          <xsl:variable name="e03">  
            <xsl:value-of select="name(@*[contains(.,'e03')])"/>  
          </xsl:variable>
<td><xsl:value-of select="$e01" /></td>  
<td><xsl:value-of select="$e02" /></td>  
<td><xsl:value-of select="$e03" /></td>

Hat jemand eine Idee, wie ich bei der Tabellenausgabe Code sparen kann?

Grüße
bearli

  1. Hallo,

    Dynamisch Namen einer Variable zuzuweisen ist meines Wissens nicht moeglich in XSL. Was spricht in deiner Aufgabenstellung gegen eine xsl:for-each loesung?

    Gruss Holge r

    1. Danke Holger für die Antwort.

      Ich weiß leider nichtmal, wie ich das Problem mit einem for-each lösen soll. Kann ich mit dem for-each die vorhandenen Variablen (ca 80 sind es an der Zahl) der Reihe nach jeweils in einem td ausgeben?

      Ich danke dir.

      1. Hallo,

        Also mit einer for-each duerfte es auch etwas schwierig sein, da sich das for-each auf vorhandene XML Knoten bezieht. Anbei ein Beispiel wie du es loesen koenntest mit einen iterativen Prozess indem ein template 80 mal aufgerufen wird und die Variable jeweils um eins erhoeht wird und du daduarch den suchstring dynamisch bildest. Habe das Ganze aber nicht getestet und meine XSL coding ist schon etwas eingerostet ;-)

          
            <xsl:template match="*">  
                 <!-- rufe die loop-Schleife auf -->  
                <xsl:call-template name="loop"/>  
            </xsl:template>  
          
            <!-- loop template mit start groesse eins -->  
            <xsl:template name="loop">  
              <xsl:param name="number" select="1"/>  
                <!-- zahlen kleiner neun um zweite digit erweitern -->  
                <xsl:variable name="searchString">  
                    <xsl:choose>  
                        <xsl:when test="$number > 9">  
                            <xsl:value-of select="concat('e',$number)"/>  
                        </xsl:when>  
                        <xsl:otherwise>  
                            <xsl:value-of select="concat('e0',$number)"/>  
                        </xsl:otherwise>  
                    </xsl:choose>  
                </xsl:variable>  
                <!-- schreibe td element -->  
                <xsl:element name="td">  
                    <xsl:value-of select="name(@*[contains(.,$searchString)])"/>  
                </xsl:element>  
                <!-- erhoehe number um eins und start erneut abfrage bis number gleich 80 -->  
                <xsl:if test="$number != 80">  
                    <xsl:call-template name="loop">  
                        <xsl:with-param name="number" select="$number + 1"/>  
                    </xsl:call-template>  
                </xsl:if>  
            </xsl:template>  
          
        
        

        Du sollltest auch nachdenken deinen XPATH Abfrage zu optimieren, da dein XPATH Angabe alle gueltigen knoten erfasst. Zu Beispiel nur den ersten Knoten name(@*[contains(.,$searchString)][1])

        Gruss Holge r

        1. Habe das Ganze aber nicht getestet und meine XSL coding ist schon etwas eingerostet ;-)

          Herzlichen Dank Holger für die Mühe. Es scheint bei dir nur Flugrost gewesen zu sein, funktioniert nämlich alles wie es soll :)

          Was nun dabei rausgekommen ist, ist eine riesige Tabelle mit den einzelnen Einstellungen eines Films und deren möglichen Relationen nach dem Allen-Kalkül. Siehe Bildausschnitt...

          Also - danke!

          Bearli

  2. Hallo,

    wieso gehst du den Weg über die Variable überhaupt?

    Warum nicht:
    <td><xsl:value-of select="name(@*[contains(.,'e01')])" /></td>

    Ansonsten ist mir die Aufgabe nicht ganz klar... Gib den Namen des erstbesten Knotens aus, bei dem ein beliebiges Attribut den Teilstring xyz enthält?

    VG