Re[7]: [xslt] Непонятка с xsl:key
От: hredwolf  
Дата: 05.02.12 14:44
Оценка:
В таких условиях да, могут быть проблемы, но если условия такие, как в задаче и меняться не собираются, то почему нет? А на будущее я бы предложил вариант перехода на xslt2.0, тогда уйдет огроменная масса проблем, решаемая обычно с помощью всяких хаков.

Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, hredwolf, Вы писали:


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


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


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


L>Не нравится это решение мне потому, что оно не напрямую решает эту задачу, в через одно место.

L>Ведь сама задача звучит так: найти уникальные по заданному атрибуту элементы item внутри заданного контекста.

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

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

L>Мой же вариант прямой как палка и один-в-один ложится на формулировку задачи:

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

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