Re[6]: [xslt] Непонятка с xsl:key
От: Lloyd Россия  
Дата: 05.02.12 13:43
Оценка:
Здравствуйте, hredwolf, Вы писали:

L>>Использовать составные ключи для этой задачи можно, но не нужно. Если есть более прямые пути, то надо спользовать их.


H>Не соглашусь. Ключи тут не работают из-за того, что мы не можем нормально задать контекст поиска, в xslt2 эта проблема решена возможностью указания top node при вызове key, а в xslt1 натуральным способом решения проблемы выглядят составные ключи, что по сути есть handmade эмуляция решения из xslt2. По мне так это точно натуральней и более производительней, чем доп. переменные и трики с count(s)=count(s|a).


Не могу согаситься. Решение в с top-ом мне нравится, а вариант с сотавным ключем — совсем нет.

Не нравится это решение мне потому, что оно не напрямую решает эту задачу, в через одно место.
Ведь сама задача звучит так: найти уникальные по заданному атрибуту элементы item внутри заданного контекста.

Ваше решение для этого вводит искуственное понятие составного ключа, которое приписывается каждому элементу в item в документе и потом этот ключ уже и используется.
У такого решения просматриваются как минимум 2 недостатка:
1. код по решению задачи размазывается по всему документу (для решения локальной задачи вводим глобальный ключ, сформированный специальным образом)
2. ваш код очень легко ломается, если внутри items, что вы обрабатываем оказываются и другие дочерние items и универсального решения не просматривается вовсе.

Мой же вариант прямой как палка и один-в-один ложится на формулировку задачи:
.//item[@src and generate-id()= generate-id(key('srcKeys', @src)[count($items) = count($items|.)])]
1. Взять все item текущего узла (.//item)
2. Для каждого item-а из найти все узлы item с таким же значением атрибута src (key('srcKeys', @src))
3. Из этого набора оставить только узлы, которые являются детьми ткущего item-а ([count($items) = count($items|.)])
4. Проверить, что текущий item является первым в полученном наборе (generate-id(.) = generate-id(...))

Тут единственная сложность, которая может возникнуть — это 3-й пункт. Тут согласен, в xpath-е нет нормальных функций по проверке вхождения элемента во множество, приходится изворачиваться таким способом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.