<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
答案 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
编码。