оператор запятой в xpath, это как c?

    <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]" />

Я вижу, что делает «если», но я не уверен, как понять остальные элементы команды, а затем [1] в конце. Означает ли это, что это «первый непустой элемент в списке?»


person bmargulies    schedule 18.03.2011    source источник


Ответы (2)


Из http://www.w3.org/TR/xpath20/#construct_seq

Определение. Одним из способов построения последовательности является использование оператора запятой, который оценивает каждый из своих операндов и объединяет результирующие последовательности по порядку в единую результирующую последовательность.

Частичный БНФ:

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

И с http://www.w3.org/TR/xpath20/#id-filter-expr

[Определение: выражение фильтра состоит просто из основного выражения, за которым следует ноль или более предикаты. Результат выражения фильтра состоит из элементов, возвращаемых первичным выражением, отфильтрованных путем применения каждого предиката по очереди слева направо.] Если предикаты не указаны, результатом является просто результат первичного выражения. Порядок элементов, возвращаемых выражением фильтра, совпадает с их порядком в результате основного выражения. Контекстные позиции назначаются элементам на основе их порядкового положения в результирующей последовательности. Первая контекстная позиция — 1.

Вопрос:

Означает ли это, что это первый непустой элемент в списке?

Ответ: Не совсем. Это выбирает первый элемент в списке. Нет пустого элемента, есть пустая последовательность. А поскольку нет вложенных последовательностей (формально кортежей), они просто объединяются в плоскую последовательность.

person Community    schedule 18.03.2011

Идиома (A, B, C)[1] в XPath 2.0 часто используется для обозначения «если существует A, то A; иначе, если существует B, то B; иначе, если существует C, то C; иначе ничего». Что, я думаю, соответствует вашему перефразированию «первый непустой элемент в списке». Технически он строит последовательность, содержащую все элементы, выбранные A, затем все элементы, выбранные B, затем все элементы, выбранные C, и затем выбирает первый элемент в списке. Но из-за ленивой оценки и конвейерной обработки маловероятно, что он действительно построит весь список.

person Michael Kay    schedule 20.03.2011
comment
Для меня большая честь получить ответ от автора Saxon. - person bmargulies; 21.03.2011