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