Karl: Attribut in Variable auflösen

Hallo,

ich probiere gerade abhängig von einem Attribut eine Variable aufzulösen, es gibt ein Attribut om mit den Werten t01, t02, t03, t04 und abhängig vom Attributwert wird dann ein Buchstabe angezeigt. Allerdings möchte ich alle Textausgaben in eine externe Datei auslagern, dass ich die Sprachausgaben übersichtlich in einer Datei habe.

in der Sprachdatei hatte ich mir folgendes überlegt:
<xsl:variable name="txtt01">A</xsl:variable>
<xsl:variable name="txtt02">D</xsl:variable>
<xsl:variable name="txtt03">E</xsl:variable>
<xsl:variable name="txtt04">W</xsl:variable>

für meine ausführende xsl-Datei:
<xsl:variable name="txtT"><xsl:value-of select="concat('txt',@om)"/></xsl:variable>
<xsl:copy-of select="$txtT"/>

Ich habe auch schon das hier probiert:
<xsl:copy-of select="concat('$txt', @om)"/>

aber er löst es nicht auf sondern schreibt dann nur txtt01.

Gibt es eine Möglichkeit und ich sehe sie nicht oder ist dies gar nicht möglich?
Viele Grüße
Karl

  1. Hallo,

    aufgrund deiner Beschreibung habe ich nicht die geringste Ahnung was du treibst!

    ich probiere gerade abhängig von einem Attribut eine Variable aufzulösen, es gibt ein Attribut om mit den Werten t01, t02, t03, t04 und abhängig vom Attributwert wird dann ein Buchstabe angezeigt. Allerdings möchte ich alle Textausgaben in eine externe Datei auslagern, dass ich die Sprachausgaben übersichtlich in einer Datei habe.

    in der Sprachdatei hatte ich mir folgendes überlegt:
    <xsl:variable name="txtt01">A</xsl:variable>
    <xsl:variable name="txtt02">D</xsl:variable>
    <xsl:variable name="txtt03">E</xsl:variable>
    <xsl:variable name="txtt04">W</xsl:variable>

    für meine ausführende xsl-Datei:
    <xsl:variable name="txtT"><xsl:value-of select="concat('txt',@om)"/></xsl:variable>
    <xsl:copy-of select="$txtT"/>

    Warum kein

    <xsl:variable name="txtT">  
      <xsl:choose>  
        <xsl:when test="t01">A</xsl:when>  
        ...  
      
      
    </xsl:variable>
    

    ?

    Viele Grüße
    Siri

    1. Natürlich so:

      <xsl:variable name="txtT">

      xsl:choose
          <xsl:when test="@om ='t01'">A</xsl:when>
          ...

      </xsl:variable>

      
      
      1. Natürlich so:

        <xsl:variable name="txtT">

        xsl:choose
            <xsl:when test="@om ='t01'">A</xsl:when>
            ...

        </xsl:variable>

        
        >   
          
        Ich möchte ja die Textpassagen (D steht zB für Days) in eine extra xsl-Datei auslagern, in der nur Textvariablen definiert sind. Klar könnte ich auch jeden einzelnen Wert abfragen und dann die Variable aus der externen Datei lesen, aber ist halt umständlicher (v.a. weil es nicht nur 4 Werte gibt, sondern 15 Werte). Schöner wäre es wenn man die Variablen zB mit einem txt vornedran so benennt, wie der Attributname heißt und dann den Wert aus der externen Datei bekommt.  
          
        Ist die Frage nun klarer? Ich habe für das Attribut om insgesamt 15 Werte, anstatt immer zu schreiben <xsl:when test="@um='t01'><xsl:copy-of select="$txtt01"/></xsl:when> hatte ich gehofft, dass es möglich ist, wenn man die Variable mit txt+Attributwertnamen benennt, dass dann diese dann einfacher auslesen kann ohne xsl:when zu benötigen.  
        Viele Grüße
        
        1. Hallo,

          Ist die Frage nun klarer?

          Ich denke: ja!

          Hab's nicht ausprobiert, aber das könnte ein Ansatz für dich sein.

          Viele Grüße
          Siri

          1. Hallo,

            Ist die Frage nun klarer?
            Ich denke: ja!

            Hab's nicht ausprobiert, aber das könnte ein Ansatz für dich sein.

            Viele Grüße
            Siri

            Vielen Dank für deinen Tipp aber bisher bin ich nicht wirklich weitergekommen. Aber trotzdem vielen lieben Dank. Versuche mein GLück weiter ;-)

            LG Karl

            1. Hallo,

              und wie wäre es mit einem

              <xsl:variable
               <xsl:call-template
                 <xsl:with-param select="@om"

              </xsl:variable>

              Das kannst du doch auch auslagern und dort wieder mit <xsl:choose den gewünschten Rückgabewert erzeugen.

              Viele Grüße
              Siri

              1. Hi Siri (heißt ja wie das i-phone oder? ;-) )

                ich habs jetzt einfach doch so gemacht, dass ich in die externe Datei die Variablenzuweisungen gemacht habe.

                <xsl:variable name="txtom01">FH</xsl:variable>
                <xsl:variable name="txtom02">FC</xsl:variable>
                <xsl:variable name="txtom03">M</xsl:variable>
                <xsl:variable name="txtom04">W</xsl:variable>

                und in meiner Haupt-CS-Datei habe ich ein <xsl:template name="om">, beim ich einen Parameter übergeben, da der Attributwert an verschiedenen STellen vorkommen kann, von welchem Knoten ich komme und das Attribut auslese und dann mit choose eine Auswahl welche Variable angezeigt werden soll:
                  <xsl:template name="om">
                    <xsl:param name="nodeName"/>
                    <xsl:variable name="strOM">xsl:choose
                       <xsl:when test="$nodeName='fr'"><xsl:value-of select="fr/th/@om"/></xsl:when>
                       <xsl:when test="$nodeName='to'"><xsl:value-of select="to/th/@om"/></xsl:when>
                       <xsl:when test="$nodeName='th'"><xsl:value-of select="@uom"/></xsl:when>
                     </xsl:choose></xsl:variable>
                    xsl:choose
                      <xsl:when test="$strOM='om01'"><xsl:copy-of select="$txtom01"/></xsl:when>
                      <xsl:when test="$strOM='om02'"><xsl:copy-of select="$txtom02"/></xsl:when>
                      <xsl:when test="$strOM='om03'"><xsl:copy-of select="$txtom03"/></xsl:when>
                      <xsl:when test="$strOM='om04'"><xsl:copy-of select="$txtom04"/></xsl:when>
                    </xsl:choose>
                  </xsl:template>

                Funktioniert ganz gut - das andere wäre halt richtig cool gewesen wenns das so gegeben hätte, wie ichs mir erträumt hatte ;)

                Vielen lieben Dank auf jeden Fall nochmal
                Viele Grüße
                Karl

                1. Hallo,

                  wäre das nicht einfacher (ohne den gesamten Kontext zu kennen):

                  <xsl:template name="om">  
                       <xsl:param name="nodeName"/>  
                       <xsl:variable name="strOM"><xsl:choose>  
                          <xsl:when test="$nodeName='fr'"><xsl:value-of select="fr/th/@om"/></xsl:when>  
                          <xsl:when test="$nodeName='to'"><xsl:value-of select="to/th/@om"/></xsl:when>  
                          <xsl:when test="$nodeName='th'"><xsl:value-of select="@uom"/></xsl:when>  
                        </xsl:choose></xsl:variable>  
                       <xsl:choose>  
                         <xsl:when test="$strOM='om01'">FH</xsl:when>  
                         <xsl:when test="$strOM='om02'">FC</xsl:when>  
                         <xsl:when test="$strOM='om03'">M</xsl:when>  
                         <xsl:when test="$strOM='om04'">W</xsl:when>  
                       </xsl:choose>  
                  </xsl:template>
                  

                  Viele Grüße
                  Siri

  2. Hallo Karl,

    Gibt es eine Möglichkeit und ich sehe sie nicht oder ist dies gar nicht möglich?

    falls es um dynamische XPath-Ausdrücke geht, dann mal dyn:evaluate aus EXSLT, saxon:evaluate bzw. <xsl:evaluate xpath="fn:concat(…)"/> aus XSLT 3.0 anschauen.

    Grüße,
    Thomas