这应该可以运行:
<xsl:variable name="firstcall" select="$topcall[$topcall] |
$focusedcall[not($topcall)]" />
换句话说,如果
$topcall
节点集非空,请选择
$topcall
;如果
$topcall
节点集为空,请选择
$focusedcall
。
关于“可能有5-6个节点”的重新更新:
考虑到可能有5-6个替代品,即除了$topcall和$focusedcall外,还有3-4个...
最简单的解决方案是使用
<xsl:choose>
:
<xsl:variable name="firstcall">
<xsl:choose>
<xsl:when test="$topcall"> <xsl:copy-of select="$topcall" /></xsl:when>
<xsl:when test="$focusedcall"><xsl:copy-of select="$focusedcall" /></xsl:when>
<xsl:when test="$thiscall"> <xsl:copy-of select="$thiscall" /></xsl:when>
<xsl:otherwise> <xsl:copy-of select="$thatcall" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
然而,在XSLT 1.0中,这将把所选结果的输出转换为结果树片段(RTF:基本上是一个冻结的XML子树)。之后,您将无法在$firstcall上使用任何重要的XPath表达式来选择其中的内容。如果您稍后需要在$firstcall上执行XPath选择,例如select="$firstcall[1]",则有几个选择...
1.将这些选择放入或中,以便它们在数据被转换为RTF之前发生。或者,
2.考虑使用node-set()扩展,将RTF转换为节点集,以便您可以从中进行正常的XPath选择。该扩展程序在大多数XSLT处理器中都可用,但并非所有处理器都支持。或者,
3.考虑使用XSLT 2.0,在那里RTFs根本不是问题。实际上,在XPath 2.0中,如果您想要,您可以在XPath表达式中放置普通的if/then/else条件语句。
4.使用嵌套谓词在XPath 1.0中实现它。
select="$topcall[$topcall] |
($focusedcall[$focusedcall] | $thiscall[not($focusedcall)])[not($topcall)]"
并且需要不断地嵌套,深入到必要的程度。换句话说,我在这里使用了XPath表达式中的两个备选项,并用$focusedcall替换了它。
($focusedcall[$focusedcall] | $thiscall[not($focusedcall)])
下一轮迭代中,您需要将"$thiscall"替换为。
($thiscall[$thiscall] | $thatcall[not($thiscall)])
当然,这样会变得难以阅读且容易出错,因此除非其他选项不可行,否则我不会选择此选项。
|
是一个联合运算符(不是逻辑or
)。您之前正在对两个节点集取并集。LarsH 的解决方案将两个互斥集合的并集取出,这总是会得到其中一个。 - Wayne