stareagle: XSL: for-each über concat?

Beitrag lesen

Hallo Janine,

der Trick ist, das concat ist der Bedingung zu machen:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="/">
       <allroles>
          <xsl:for-each select="/data/*[name() = concat('roles_', $lang)]/role">
              <role>
                   <xsl:value-of select="."/>
              </role>
          </xsl:for-each>
      </allroles>
   </xsl:template>
</xsl:stylesheet>

Der XPath-Ausdruck in dem <code>select</code> des <code>xsl:for-each</code> nimmt über den <code>*</code> erst mal alle Unterelemente von <code>data</code>. Über das <em>Prädikat</em> den eckigen Klammern wird das ganze wieder auf die gewünschten Elemente eingeschränkt. Die XPath-Funktion <code>name()</code> liefert den Namen des aktuellen Knotens. Da das ganze in einem Prädikat steht wird das für jeden Knoten aufgerufen. Das ganze wird dann mit dem Ergebnis der <code>concat()</code>-Funktion verglichen. Wenn beide gleich sind, wird der Knoten verwendet, ansonsten nicht. Den Wert für die <code>$lang</code>-Variable musst du natürlich noch irgendwo an passender Stelle festlegen (oder als Parameter übergeben).

Beste Grüße

Stareagle