Является ли эта техника XPath надежной во всех ситуациях? - PullRequest
1 голос
/ 15 февраля 2011

Я разрабатываю приложение, которое принимает пользовательские выражения XPath и использует их как часть своей работы во время выполнения.

Однако я хотел бы иметь возможность выводить некоторые дополнительные данные, программно манипулируя выражением, и мне любопытно узнать, существуют ли ситуации, в которых этот подход может потерпеть неудачу.

Учитывая любое пользовательское выражение XPath, которое возвращает набор узлов, безопасно ли обернуть его в функцию XPath count(), чтобы определить количество узлов в наборе:

count(user_defined_expression)

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

user_defined_expression[1]

Ответы [ 3 ]

3 голосов
/ 15 февраля 2011

Хорошо, выражение XPath (в XPath 1.0) может дать набор узлов, или строку, или число, или логическое значение, и выполнение count (выражения) имеет смысл только для любого выражения, дающего набор узлов.

Что касается добавления позиционного предиката, я думаю, что вы можете использовать круглые скобки вокруг выражения, то есть изменить /root/foo/bar на (/root/foo/bar)[1], так как вы выбираете первый bar элемент в наборе узлов, выбранный /root/foo/bar, а без них вы получите /root/foo/bar[1], который выберет первый bar дочерний элемент любого foo дочернего элемента root элемента.

2 голосов
/ 15 февраля 2011

Проверяете ли вы, что такие пользовательские выражения всегда оцениваются как набор узлов?

Если да, первый Expr в порядке.Тип данных будет правильным для fn:count

Второй вариант намного сложнее, так как во многих ситуациях предикат будет иметь избыточную ось, например. Проверьте этот ответ для простого анализа.Трудно сказать, что на самом деле имел в виду пользователь.

1 голос
/ 15 февраля 2011

Более надежный подход заключается в преобразовании выражения XPath в XQueryX, который представляет собой представление XML абстрактного синтаксического дерева;затем вы можете выполнить преобразования XQuery или XSLT в этом XML-представлении, а затем преобразовать обратно в измененный XPath (или XQuery) для оценки.

Однако это все равно даст только синтаксическую структуру выражения;если вам нужна семантическая информация, такая как предполагаемый статический тип результата, вам, вероятно, придется ткнуть в процесс XPath, который предоставляет эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...