xpath中的逗号运算符,它是否像c?

时间:2011-03-18 16:46:46

标签: xpath xpath-2.0

    <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]。这是否会加起来“列表中的第一个非空项?”

2 个答案:

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

问题

  

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

回答:不完全。这将选择列表中的第一个项目。没有空项目,但是空序列。因为没有嵌套序列(形式元组),所以它们只是作为一个平坦的序列连接起来。