2010-06-23 4 views
10

J'ai le code xml folowing:xslt: substring-before

<weather-code>14 3</weather-code> 
<weather-code>12</weather-code> 
<weather-code>7 3 78</weather-code> 

Maintenant, je voudrais saisir que le premier numéro de chaque noeud pour définir une image d'arrière-plan. Ainsi, pour chaque noeud j'ai le xslt folowing:

<xsl:attribute name="style"> 
    background-image:url('../icon_<xsl:value-of select="substring-before(weather-code, ' ')" />.png'); 
</xsl:attribute> 

Le problème est que substring avant ne retourne rien quand il n'y a pas d'espace. Un moyen facile de contourner cela?

Répondre

17

Vous pouvez utiliser xsl:when et contains:

<xsl:attribute name="style"> 
    <xsl:choose> 
    <xsl:when test="contains(weather-code, ' ')"> 
     background-image:url('../icon_<xsl:value-of select="substring-before(weather-code, ' ')" />.png'); 
    </xsl:when> 
    <xsl:otherwise>background-image:url('../icon_<xsl:value-of select="weather-code" />.png');</xsl:otherwise> 
    </xsl:choose> 
</xsl:attribute> 
+0

+1: Je serais allé de la même manière. – Manish

+0

Les conditions Xslt sont ICK! J'aime la solution de Ledhund, mais c'est techniquement correct. – Armstrongest

1

Vous pouvez utiliser functx:substring-before-if-contains

La fonction functx:substring-before-if-contains effectue substring-before, retournant la chaîne entière si elle ne contient pas le delimiter. Il diffère de la fonction fn:substring-before intégrée, qui renvoie une chaîne de longueur nulle si le délimiteur est introuvable.

Regarder the source code, il est mis en œuvre comme suit:

<xsl:function name="functx:substring-before-if-contains" as="xs:string?"> 
<xsl:param name="arg" as="xs:string?"/> 
<xsl:param name="delim" as="xs:string"/> 
<xsl:sequence select= 
    "if (contains($arg,$delim)) then substring-before($arg,$delim) else $arg"/> 
</xsl:function> 
+0

que xsl: séquence chose semble utile. J'ai déjà mis en œuvre la méthode d'Oded, mais je vais sûrement essayer cette fois la prochaine fois un visage quelque chose de similaire. –

20

Vous pouvez vous assurer qu'il ya toujours un espace, peut-être pas la plus jolie, mais au moins il est compact :)

<xsl:value-of select="substring-before(concat(weather-code, ' ') , ' ')" /> 
+1

+1 cause c'est si compact :) –

+0

+1 évite les conditions qui conduisent à d'autres problèmes dans un cas d'utilisation J'ai –

+0

+1 pensée non-linéaire. J'aime. – Armstrongest