2012-07-28 2 views
1

Чем больше я узнаю XPath тем больше мне нужно обратно refererencingНазад ссылки в XPath

Например, когда я обнаружил некоторую информацию в некоторых промежуточных шагов, я иногда необходимо использовать информацию позже. Эта проблема на самом деле имеет обходное решение с небольшой помощью способности выражения предикатов также содержать XPathes. Рабочий раствор может выглядеть как этот

/foo/item[@attrtocheck = ../../otheritem[@anotherattr]] 

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

/foo/item[@attrtocheck]/../../otheritem[@anotherattr=BACKREFERENCING_ATTRTOCHECK_VALUE] 

но до тех пор, как я знаю, это невозможно.

Если в стандарте нет решения, возможно, есть расширение в некоторых инструментах/библиотеках? На самом деле я реализую свой собственный движок, и если уже существует нестандартный синтаксис, я бы его принял.

UPDATE: После того, как Майкл Кей комментарий, о том, почему я пропускаю эту функцию

На самом деле я imlementing поиск XPath для AST (абстрактные синтаксические деревья). Я не первый, кто пытается это сделать (веб-поиск по [Xpath AST]). Такой поиск показывает очень сильные отношения между различными частями дерева. Например, когда я нашел вызов в каком-то контексте (например, внутри какого-либо другого метода), я хотел бы знать, введен ли этот символ как виртуальная функция, и если он затем выводит его в результаты. В этом случае мой первый поиск создает некоторый ранее неизвестный символ (имя функции), и я хотел бы использовать его в следующих подпакетах (поиск объявления класса и его ключевые слова). Таким образом, обратная ссылка была бы очень полезной.

Я думаю, что если он применим к AST, тогда есть возможность иметь такие отношения в других структурированных данных.

+0

Любая такая проблема может быть легко решена (вообще не проблема) в XPath 2.0. 'для $ attr in/foo/item [@attrtocheck] return/foo/otheritem [@ anotherattr = $ attr]' –

+0

Сообщите нам, что вам действительно нужна функция, которой нет, не поможет, если вы не сообщите нам какую проблему вы пытаетесь решить. –

+0

Я обновил вопрос, объяснив подробности – Maksee

ответ

2

В XQuery вы можете использовать let .. return для объявления временных переменных. Как это:

/foo/item[@attrtocheck]/(let $backreference := @attrtocheck return ../../otheritem[@anotherattr=$backreference]) 

И в XPath 2 вы можете эмулировать выражение LET с цикл:

/foo/item[@attrtocheck]/(for $backreference in @attrtocheck return ../../otheritem[@anotherattr=$backreference]) 

Или вы можете использовать цикл, как предполагалось, и сделать это без «обратной ссылки»:

for $value in /foo/item[@attrtocheck]/@attrtocheck return otheritem[@anotherattr=$value] 

и в этом случае, так как сравнения экзистенциальны и вы можете просто использовать:

otheritem[@anotherattr = /foo/item/@attrtocheck] 

(и, кстати, я также написал свою собственную реализацию XPath, и у меня есть синтаксис ((значения: =/xx/a/@ id) [0],/xx/b [@id = $ values]) для переменной , с: = определением переменной и() [0], предотвращающими наличие значений $ в возвращаемой последовательности.)

+0

Разве не ваш ответ больше о XQuery? – Maksee

+0

Также ваш вариант не для и пусть аналогичен тому, который я упомянул как недостаточно. – Maksee

+0

За исключением let let, все это XPath 2. (хотя XPath 2 в основном немного упрощен XQuery). – BeniBela

0

Я принял решение BeniBela (также упоминается Dimitre Novatchev), хотя я считаю, что эта функция как-то лишена простоты и выразительности сокращенного синтаксиса XPath 1.0.

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

/foo/item[@attrtocheck]/../../otheritem[@anotherattr=backref(-2)] 

Там нет такой функции в XPath, как я полагаю, я не буду терять общий синтаксис и референцирование предыдущих шагов умножать раз в течение пути будет выглядеть более выразительными, чем кратная для заявлений

Смежные вопросы