Действительно ли необходима [1] в мюнхианской группировке?

Ответив на большое количество вопросов XSLT здесь, в Stack Overflow, я более чем знаком с методом группировки по Мюнху для группировки узлов во время преобразования XSL.

Выражение, используемое в нем, обычно выглядит примерно так:

*[generate-id() =
  generate-id(key('kSomeKey', .)[1])]

Он почти всегда содержит [1], но это всегда казалось мне странным.

Спецификация XSLT 1.0 определяет generate-id() следующим образом:

Функция generate-id возвращает строку, однозначно идентифицирующую узел в наборе узлов-аргументов, который является первым в порядке документа.

(выделение добавлено)

В нем четко указано, что функция работает с первым узлом в порядке документа, и в этом контексте [1] будет выбирать первый узел в наборе в порядке документа, поэтому кажется, что [1] является избыточным.

Это [1] используется так широко, что я не решаюсь его опустить, но оно кажется лишним. Может ли кто-нибудь прояснить это для меня?


person JLRishe    schedule 19.12.2014    source источник
comment
Это было бы необходимо в XSLT 2.0, так как generate-id не разрешает набор узлов в качестве первого аргумента и выдает ошибку. Конечно, если бы вы использовали XSLT 2.0, вы, скорее всего, использовали бы xsl:for-each-group, а не мюнхенскую группировку.   -  person Tim C    schedule 19.12.2014


Ответы (2)


Семантически [1] не является необходимым, но в зависимости от (отсутствия) оптимизации в XSLT-процессоре его использование может быть более эффективным. Это будет зависеть от внутреннего устройства каждого процессора XSLT, вычисляет ли key('key-name', foo)[1] только один узел или сначала вычисляет набор узлов со всеми узлами, выбранными с помощью ключа, а затем берет первый настолько, насколько это зависит от процессора XSLT, чтобы распознать generate-id(key('key-name', foo)) как выражение. где необходим только первый узел в наборе узлов, вычисленном с помощью ключа.

person Martin Honnen    schedule 19.12.2014
comment
Спасибо! Это кажется достойной причиной, чтобы продолжать использовать его. - person JLRishe; 22.12.2014

Я бы рекомендовал всегда использовать явное «[1]», а не использовать тот факт, что операции в XPath 1.0 делают это неявно. По двум причинам: это улучшает читабельность вашего кода и делает его совместимым с XPath 2.0. Могут быть процессоры, где это дает преимущество в производительности, но я бы не стал спекулировать на этом, пока это не будет доказано измерениями.

person Michael Kay    schedule 19.12.2014
comment
Спасибо! (+1) Я не уверен, что согласен с тем, что это улучшает читаемость, но функциональная совместимость всегда является хорошей целью. - person JLRishe; 22.12.2014
comment
@JLRishe для тех, кто менее хорошо знаком со спецификациями XPath и XSLT, я бы сказал, что [1] действительно улучшает читаемость. Это делает совершенно ясным, что вы хотите проверить, является ли этот узел первым в своей группе, и делает очевидным, что нужно настроить, если вы хотите проверить второй/третий/последний узел в группе вместо первого. - person Ian Roberts; 20.03.2015