Разница между XPath и XQuery при выборе значения атрибута - PullRequest
1 голос
/ 10 марта 2020

Кажется, есть разница в том, как XPath и XQuery выбирают атрибуты. Вот игрушечный пример, украденный из W3Schools:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore> 

Я хочу получить значения атрибутов lang. Итак, наивно я делаю: //title/@lang, который отлично работает ... на оценщике XPath, но не на оценщике XQuery.

Что мне нужно , чтобы знать: Как мне написать выражение XPath для работы с оценщиком XQuery?

Что я хочу знать: что происходит?!

Вот часть TL:

Я на устаревшей платформе без этих возможностей, поэтому я отправляю XML и выражение моего запроса во внешнюю службу, которая, на мой взгляд, является саксонским оценщиком XQuery. Мой синтаксис работает, как и ожидалось, в CodeBeautify XPath Tester .

Я также проверил эту разницу на xpathtester.com : он работает, как и ожидалось, в режиме XPath, но не в Режим XQuery. (Примечание: ссылка не зашифрована.).

xpathtester.com возвращает следующее сообщение об ошибке: ERROR - Cannot create an attribute node (lang) whose parent is a document node

Ответы [ 2 ]

1 голос
/ 10 марта 2020

После того, как я действительно понял, о чем говорили @Martin Honnen и @Aaron, и сделал несколько глубоких погружений в учебниках, я думаю, что нашел решение, которым я доволен:

string-join((for $l in //title/@lang return string($l)) , ',')

https://xqueryfiddle.liberty-development.net/3Nzd8bR/2

1 голос
/ 10 марта 2020

Выражение //title/@lang допустимо как для XPath, так и для XQuery и возвращает последовательность из двух узлов атрибутов.

Разница заключается в том, как разные клиенты XPath и XQuery обрабатывают результат, состоящий из двух узлы атрибутов.

Если инструмент попытается сериализовать результат как XML, произойдет сбой, потому что сериализация XML попытается создать узел документа и присоединить атрибуты к документу.

Итак, вам нужно посмотреть, какие опции предоставляет инструмент XPath или XQuery для отображения результатов.

...