оператор запятой в xpath, это как с? - PullRequest
1 голос
/ 18 марта 2011
    <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] в конце. Означает ли это, что «первый непустой элемент в списке?»

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

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

1 голос
/ 18 марта 2011

С http://www.w3.org/TR/xpath20/#construct_seq

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

Частичная БНФ:

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

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

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

Вопрос :

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

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

...