Разница между именем (путь) и путем/имя(), когда вывод не является последовательностью

Разница между Xquery

    name(/Data/element1/element2[@ID=$ID]), 

а также

    /Data/element1/element2[@ID=$ID]/name()

Что является наилучшей практикой, когда результат НЕ ЯВЛЯЕТСЯ последовательностью? (Если он есть, то первый использовать в принципе нельзя)

Что-то я забыл, или они полностью взаимозаменяемы в этом случае?


person Whimusical    schedule 16.07.2012    source источник


Ответы (2)


В XPath 2.0 это выражение вызывает ошибку, если аргументом функции name() является последовательность, содержащая более одного элемента:

name(/Data/element1/element2)

В XPath 1.0 это не ошибка, и name() использует в качестве аргумента первый узел в наборе узлов.

Оба одинаково бесполезны, так как с первого взгляда известно, что результат должен быть "element2".

Что является наилучшей практикой, когда результат НЕ ЯВЛЯЕТСЯ последовательностью (если это так, то первый нельзя использовать в принципе)?

Это работает в обоих случаях в XPath 2.0/XQuery:

/Data/element1/element2/name()
person Dimitre Novatchev    schedule 16.07.2012
comment
Вы правы в том, что результат известен в element2, я немного изменил пример, чтобы понять идею. Я имел ввиду динамический выбор, может слишком просто сделал - person Whimusical; 16.07.2012

Хорошо, разница в том, что нет никакой разницы, поскольку это одна и та же функция, потому что name() равно name(.), поэтому это не другой синтаксис. Что происходит, так это то, что имя (X) должно ВСЕГДА содержать выражение с не более чем 1 вхождением вывода.

поэтому мы могли бы использовать:

/Data/name(./element1/element2) = /Data/name(element1/element2) 
 * element2, if a single occurrence in the whole data

/Data/element1/name(./element2) = /Data/element1/name(element2)
 * element2, if a single occurrence per any element1, for each element1

/Data/element1/element2/name() = /Data/element1/element2/name(.)
 * element2, no matter num of occurrences, we print them all 

Таким образом, когда мы ожидаем только одно вхождение, name(complete_expression) может быть предпочтительнее, так как мы можем добавить дополнительный шаг проверки для нашего предположения, но альтернатива также имеет сильную сторону, заключающуюся в том, что мы можем подготовить местность для обработки нескольких входных данных для выражения (массив ) если когда-нибудь данные изменятся, и это действительно и ожидаемо

person Whimusical    schedule 16.07.2012