web-dev-qa-db-ja.com

xslt:部分文字列-前

私は次の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>

問題は、スペースがない場合、beforeの部分文字列が何も返さないことです。これを回避する簡単な方法はありますか?

12
Jules Colle

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

あなたは常にスペースがあることを確認することができます、多分最もきれいではないかもしれませんが、少なくともそれはコンパクトです:)

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

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