2010-06-23 2 views
10

У меня есть ниже код XML:XSLT: подстрока-перед тем

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

Теперь я хотел бы, чтобы только захватить первое число каждого узла, чтобы установить фоновое изображение. Таким образом, для каждого узла, у меня есть на следующие XSLT:

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

Проблема заключается в том, что подстрока, прежде чем ничего не возвращает, когда нет никакого пространства. Любой простой способ обойти это?

ответ

17

Вы можете использовать xsl:when и 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: Я бы пошел так же. – Manish

+0

Условия Xslt - это ICK! Мне нравится решение Ледхунда, но это технически правильно. – Armstrongest

1

Вы можете использовать functx:substring-before-if-contains

functx:substring-before-if-contains функция выполняет substring-before, возвращая всю строку, если она не содержит разделитель. Он отличается от встроенной функции fn:substring-before, которая возвращает строку нулевой длины, если разделитель не найден.

Глядя на the source code, это реализуется следующим образом:

<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

что вещь xsl: последовательность выглядит полезной. Я уже реализовал метод Одеда, но я обязательно попробую в следующий раз увидеть что-то подобное. –

20

Вы можете убедиться, что всегда есть пространство, возможно, не самый красивый, но по крайней мере это компактный :)

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

+1 потому что это настолько компактно :) –

+0

+1 избегает условных выражений, которые приводят к другим проблемам в прецеденте. У меня есть –

+0

+1 нелинейное мышление. Мне нравится. – Armstrongest

Смежные вопросы