使用xsl选择填充变量

时间:2012-02-18 13:42:48

标签: xml xslt

<xsl:template match="/">
      <xsl:variable name="a" select="'a'"/>
      <xsl:variable name="b" select="'b'"/>
      <xsl:variable name="c" select="'c'"/>
      <xsl:variable name="result">
        <xsl:choose>
          <xsl:when test="$a !=''">
            <xsl:value-of select="$a"/>
          </xsl:when>
          <xsl:when test="$b !=''">
            <xsl:value-of select="$b"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$c"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

填充结果变量,这里我使用了xsl choose语句。我只是想知道是否有任何其他有效或简单的方法来填充结果变量,基于与xsl选择相同的逻辑。

像这样的东西

<xsl:variable name="result" select="$a | $b | $c" />

以上内容适用于节点集,不适用于变量。任何输入?xsl 1.0

2 个答案:

答案 0 :(得分:2)

  

像这样的东西

<xsl:variable name="result" select="$a | $b | $c" /> 
     

以上内容适用于节点集,不适用于变量。任何输入?xsl   1.0

这是错误的!上面的result变量被定义为包含三个节点集的并集 - 而不仅仅是其中一个节点集,具体取决于是否有其他一些节点集他们是空的。

在这种情况下,正确的XPath表达式是

$a | $b[not($a)] | $c[not($a | $b)]

当这三个变量不是节点集而是字符串时,如果这些字符串值可以具有任意长度(不仅长度为1),则相应的XPath表达式类似:

concat($a, 
       substring($b, 1 div ($a = '')), 
       substring($c, 1 div (concat($a, $b) = ''))
       )

这里我们使用以下事实:

substring($s, $k)是空字符串''

每当

$k >= string-length($s)

substring($s, 1) = $s

此外:

1 div false()

positive Infinity

(在算术运算中使用时false()转换为0。

按定义

positive Infinity > $k

表示每个整数$k

因此,

substring($s, 1 div $somethingFalse) = ''

substring($s, 1 div $somethingTrue) = $s

最后,如果可以保证三个变量$a$b$c只能包含一个字符,那么我们可以使用只是:

substring(concat($a, $b, $c), 1, 1)

答案 1 :(得分:1)

如果变量绑定到节点集,那么$a | $b | $c会产生这些节点集的并集,而不是替代方案,因此我不确定您要通过呈现该示例来解释什么。

在您的第一个代码示例中,您有三个变量,其值为string类型,其中每个变量都包含一个字符,因此如果您想要的单个字符或空字符串,您可以执行<xsl:variable name="result" select="substring(concat($a, $b, $c), 1, 1)"/>找到变量“集合”中的第一个字符。但一般来说,XSLT 1.0可能需要详细的xsl:choose/when/otherwise编码。