xslt: substring-before - PullRequest
       16

xslt: substring-before

11 голосов
/ 23 июня 2010

У меня есть следующий xml-код:

<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>

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

Ответы [ 3 ]

22 голосов
/ 23 июня 2010

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

<xsl:value-of select="substring-before( concat( weather-code, ' ' ) , ' ' )" />
19 голосов
/ 23 июня 2010

Вы можете использовать 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>
1 голос
/ 23 июня 2010

Вы можете использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...