Announcement

Collapse
No announcement yet.

Lösungsansatz gesucht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Lösungsansatz gesucht

    Moin!

    Ich möchte ein Feld in Abhängigkeit seines Wertes mit unterschiedlichen Hintergrundfarben darstellen.
    Also: ich hab so ca. 100 Wert/Farb Paare. Nun könnte ich die Farbzuordnung innerhalb eines Templates machen (Wert übergeben und dann 100 if's oder when's). Aber das ist nicht sehr schön. Kann man das auch anders händeln? Evtl. sogar die Farb/Wert Paare auslagern in eine separate xslt die man dann mehrfach, zusätzlich zur normalen xslt einbinden kann?
    Wenn's geht würde ich das auch gerne ohne Scriptsparche tun. Dort könnte man natürlich ganz einfach mit einem array arbeiten.

    Paul

  • #2
    Nachtrag

    Nachtrag:
    Habe die Farb/Wert Paare ermittelt. Nun muss ich diese noch verbinden. Aber wie?


    <xsl:variable name="wert" select="meinFeld" />
    wert:<xsl:value-of select="$wert" /> <!-- Hallo -->
    <xsl:variable name="colors" select="document('colors.xml')/colors/$wert"/>

    Fehler! Wie kann ich das neue Dokument mit einer Variablen ($wert) durchsuchen?

    Comment


    • #3
      Wie sieht "colors.xml" genau aus? Und was steht in "meinFeld"?
      Generell löst man das mit einem key, also etwa
      Code:
      <colors>
         <color name="foo" value="red"/>
         <color name="bar" value="green"/>
      </colors>
      Code:
      <root>
         <data name="foo"/>
      </root>
      Code:
      <xsl:key name="k1" match="color" use="@name"/>
      
      <xsl:template match="data">
        ...
        <xsl:value-of select="key('k1', @name, document('colors.xml')/@value"/>
      </xsl:template>
      Beachte, dass die key-Funktion mit drei Argumenten nur in XSLT 2.0 existiert, in XSLT 1.0 muss man etwas mehr schreiben:
      Code:
      <xsl:key name="k1" match="color" use="@name"/>
      
      <xsl:template match="data">
        ...
        <xsl:variable name="name" select="@name"/>
          <xsl:for-each select="document('colors.xml')">
            <xsl:value-of select="key('k1', $name)/@value"/>
          </xsl:for-each>
      </xsl:template>

      Comment


      • #4
        Ich hab das in der Zwischenzeit so gelöst:


        colors.xml
        Code:
        <colors>
          <a>red</a>
          <b>green</b>
          ...
        </colors>
        Code:
        <xsl:variable name="colorAusDatei" select="document('colors.xml')/colors/*[name() = $meinWert]"/>
        $meinWert ist z.B. "a"

        Spricht etwas dagegen?

        Comment


        • #5
          Mittels eines key sollte sich das effizienter lösen lassen
          Code:
          <xsl:key name="k1" match="colors/*" use="local-name()"/>
          
          <xsl:template match="...">
            ...
            <xsl:variable name="colorAusDatei" select="key('k1', $meinWert, document('colors.xml'))"/>
            ...
          </xsl:template>
          Sonst spricht aus XSLT-Sicht nichts gegen deinen Code. Aus XML-Entwurfssicht ist das Verwenden von Elementnamen als Daten natürlich problematisch, wenn du eine DTD oder ein Schema definieren wolltest, müsstest du Schema oder DTD jedes mal ändern, wenn ein Feld hinzukommt.

          Comment


          • #6
            Wie würde das dann in xslt 1 aussehen?

            Paul

            Comment


            • #7
              Alles klar, alles klar.
              Habe das ganze nun noch in eine Variable verpackt und nun läuft's. Danke!

              Code:
              <xsl:key name="key1" match="colors/*" use="local-name()"/>
              Code:
                      <xsl:variable name="wert" select="meinWert" />
                      <!-- xslt 2.0 xsl:variable name="colorAusColors" select="key('key1', $wert, document('colors.xml'))"/-->
                      <xsl:variable name="colorAusColors">
                          <xsl:for-each select="document('colors.xml')">
                              <xsl:value-of select="key('key1', $wert)"/>
                          </xsl:for-each>
                      </xsl:variable>

              Comment

              Working...
              X