<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]。这是否会加起来“列表中的第一个非空项?”
答案 0 :(得分:4)
XPath 2.0中的习语(A, B, C)[1]
通常用于表示“如果A存在,则A;否则如果B存在,则B;否则如果C存在则C;否则不存在。”我想这与您的释义“列表中的第一个非空项目”匹配。从技术上讲,它构建一个序列,其中包含A选择的所有项目,然后是B选择的所有项目,然后是C选择的所有项目,然后选择列表中的第一个项目。但由于懒惰的评估和流水线操作,它不太可能实际构建整个列表。
答案 1 :(得分:1)
来自http://www.w3.org/TR/xpath20/#construct_seq
定义:构建一种方法的一种方法 序列是使用逗号 运算符,用于计算每个值 它的操作数和连接数 结果序列按顺序进入a 单个结果序列
部分BNF:
[2] Expr ::=
ExprSingle
(","
ExprSingle
)*
来自http://www.w3.org/TR/xpath20/#id-filter-expr
[定义:A 过滤表达式 仅包含主要内容 表达式后跟零或更多 predicates。结果 过滤器表达式由 主要退回的项目 表达式,通过应用每个来过滤 反过来说,从左边开始工作 向右。]如果没有谓词 指定,结果就是 主要表达的结果。该 订购由a返回的项目 过滤器表达式与它们相同 在主要结果中排序 表达。背景位置是 分配给基于他们的项目 结果中的序数位置 序列。第一个背景位置 是1。
问题:
这是否是第一个 列表中的非空项目?
回答:不完全。这将选择列表中的第一个项目。没有空项目,但是空序列。因为没有嵌套序列(形式元组),所以它们只是作为一个平坦的序列连接起来。