1
    <xsl:variable name="html-output-name" 
         select="(if(@index and @index eq 'true') 
             then concat($default-name, '.html') 
             else (), 
         @html-output-name,
         @output-name, 
         $default-html)[1]" />

我看到“if”在做什么,但我不确定如何理解命令中的其余项目,然后是最后的 [1]。这加起来是“列表中的第一个非空项目吗?”

4

2 回答 2

4

XPath 2.0 中的习语(A, B, C)[1]经常被用来表示“如果 A 存在,则 A;否则如果 B 存在,则 B;否则如果 C 存在则 C;否则什么都没有”。我猜这与您的解释“列表中的第一个非空项目”相匹配。从技术上讲,它构建了一个序列,其中包含 A 选择的所有项目,然后是 B 选择的所有项目,然后是 C 选择的所有项目,然后它选择列表中的第一个项目。但由于延迟评估和流水线,它不太可能真正构建整个列表。

于 2011-03-20T17:14:51.900 回答
1

来自http://www.w3.org/TR/xpath20/#construct_seq

定义:构造序列的一种方法是使用逗号运算符,它计算每个操作数并将结果序列按顺序连接成单个结果序列

部分 BNF:

[2] Expr ::=ExprSingle(","ExprSingle)*

并来自http://www.w3.org/TR/xpath20/#id-filter-expr

[定义:过滤器表达式 仅由一个主表达式后跟零个或多个 谓词组成。过滤表达式的结果由主表达式返回的项组成,依次应用每个谓词进行过滤,从左到右进行。] 如果没有指定谓词,则结果只是主表达式的结果。过滤器表达式返回的项目的顺序与它们在主表达式结果中的顺序相同。上下文位置根据项目在结果序列中的顺序位置分配给项目。第一个上下文位置是 1。

问题

这是否加起来是列表中的第一个非空项目?

:不完全。这将选择列表中的第一项。没有空项目,只有空序列。而且因为没有嵌套序列(正式的元组),它们只是连接为一个平面序列。

于 2011-03-18T16:55:00.523 回答