2010-06-23 5 views
10

tengo el código XML folowing:XSLT: subcadena antes

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

Ahora me gustaría sólo para agarrar el primer número de cada nodo para establecer una imagen de fondo. Así que para cada nodo tengo el XSLT folowing:

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

problema es que antes de subcadena no devuelve nada cuando no hay espacio. ¿Hay alguna forma fácil de solucionar esto?

Respuesta

17

Puede utilizar xsl:when y 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: Me habría ido de la misma manera. – Manish

+0

Xslt condicional es ICK! Me gusta la solución de Ledhund, pero esto es técnicamente correcto. – Armstrongest

1

Puede utilizar functx:substring-before-if-contains

La función functx:substring-before-if-contains realiza substring-before, devolver toda la cadena si ésta no contiene el delimitador. Se diferencia de la función incorporada fn:substring-before, que devuelve una cadena de longitud cero si no se encuentra el delimitador.

En cuanto a the source code, se implementa de la siguiente manera:

<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

esa cosa xsl: sequence parece útil. Ya he implementado el método de Oded, pero seguramente probaré esto la próxima vez con una cara similar. –

20

Puede asegurarse de que siempre hay un espacio, quizás no es el más bonito, pero por lo menos es compacta :)

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

+1 porque es muy compacto :) –

+0

+1 evita condicionales que conducen a otros problemas en un caso de uso Tengo –

+0

+1 pensamiento no lineal. Me gusta. – Armstrongest