Xslt: подстрока перед
У меня есть следующий xml-код:
<weather-code>14 3</weather-code>
<weather-code>12</weather-code>
<weather-code>7 3 78</weather-code>
Теперь я хотел бы только захватить первое число каждого node, чтобы установить фоновое изображение. Поэтому для каждого node у меня есть xslt:
<xsl:attribute name="style">
background-image:url('../icon_<xsl:value-of select="substring-before(weather-code, ' ')" />.png');
</xsl:attribute>
Проблема заключается в том, что подстрока before не возвращает ничего, когда нет места. Любой простой способ обойти это?
Ответы
Ответ 1
Вы можете использовать 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>
Ответ 2
Вы можете убедиться, что всегда есть место, может быть, не самое красивое, но, по крайней мере, компактное:)
<xsl:value-of select="substring-before( concat( weather-code, ' ' ) , ' ' )" />
Ответ 3
Вы можете использовать functx:substring-before-if-contains
Функция functx:substring-before-if-contains
выполняет substring-before
, возвращая всю строку, если она не содержит разделителя. Он отличается от встроенной функции fn:substring-before
, которая возвращает строку нулевой длины, если разделитель не найден.
Посмотрев исходный код, он реализован следующим образом:
<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>