xslt:substring-before

时间:2010-06-23 08:41:53

标签: xslt substring

我有以下的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>

问题是,当没有空格时,substring之前不会返回任何内容。有什么简单的方法吗?

3 个答案:

答案 0 :(得分:22)

你可以确保总有一个空间,也许不是最漂亮的,但至少它是紧凑的:)

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

答案 1 :(得分:19)

您可以使用xsl:whencontains

<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 :(得分: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>