2014-01-15 2 views
1

Несмотря на название, я спрашиваю общий вопрос здесь:Что делает этот запрос XPath?

Есть ли способ отладки оператор XPath, или, возможно, перевести его на английский язык (то есть что-то похожее на этот фантастический REGEX tool)

Дело в пункт: Я получил этот запрос XPath:

//transaction[@sumPrice != sum(id(@products) /@price)

Пусть я Newb в XPath (Я). Я хочу разбить его и получить некоторые результаты, которые помогут мне понять каждый компонент. Однако, если я вытащил определенную часть, скажем id(@products), я не знаю, где ее поставить, чтобы получить какую-то обратную связь. Кажется, вы не можете разбить его. Как я могу разбить его и проанализировать?

В качестве бонуса, если можете, что говорит мой запрос?

+0

@IanRoberts, что случилось? – CodyBugstein

+2

Я понял, что неправильно понял функцию «id», и ваше первоначальное выражение _did_ имеет смысл в конце концов. –

+0

Haha nice - я был на самом деле в середине комментирования, когда он обновился, и ваш ответ исчез. – CodyBugstein

ответ

2

Я не знаю инструмента, но несколько базовых концепций помогут вам здесь.

  • //transaction будет выбран все элементы с именем transaction в никаких имен, расположенные в любом месте в исходном документе.
  • [...] выражение предикат, который оценивается один раз для каждого элемента, выбранного на этапе пути, к которому он присоединен, и который фильтрует список для извлечения только тех узлов, для которых предикат является истинным.

Чтобы разбить такое выражение для отладки, вам нужно начинать с левой стороны и добавлять шаг за шагом, проверяя результаты по мере продвижения. Для предиката вам придется вручную перебирать результаты выражения, к которому привязан предикат, а затем оценивать (части) предикатного выражения с узлом контекста, установленным каждым узлом в этом списке по очереди. Именно то, как вы это делаете, зависит от используемого вами инструмента или библиотеки XPath.


Таким образом, в данном конкретном случае мы выбрать все транзакции, чьи sumPrice значение отличается от значения

sum(id(@products) /@price) 

id(@products) принимает значение атрибута на transactionproducts тестируется, разделяет его а затем просматривает набор элементов в документе с атрибутом идентификатора (что означает атрибут идентификатора типа в соответствии с DTD документа), его необязательно можно называть id), значением которого является такой же, как любой из этих жетоны. Наконец /@price затем дает вам атрибут price для каждого из этих элементов, а sum суммирует их все. Например, если этот XML:

<!DOCTYPE root [ 
    <!-- rest of DTD omitted --> 
    <!ATTLIST product ident ID #REQUIRED> 
]> 
<root> 
    <transactions> 
    <transaction sumPrice="5" products="prod1 prod2" /> 
    <transaction sumPrice="10" products="prod2 prod3" /> 
    </transactions> 
    <product ident="prod1" price="3" /> 
    <product ident="prod2" price="2" /> 
    <product ident="prod3" price="4" /> 
</root> 

Выражение

//transaction[@sumPrice != sum(id(@products)/@price)] 

бы выбрать вторую транзакцию (как сумма цен prod2 и prod3 не 10), но не выбрали бы первый (потому что prod1 + prod2 дает 5).

+0

Спасибо за объяснение, это имеет смысл, но на практике это не работает ... когда Я запускаю этот запрос на предоставленном XML, он возвращает все – CodyBugstein

+0

@Imray, что предполагает, что DTD обрабатывается неправильно, поэтому атрибуты 'ident' не распознаются как идентификаторы. Это означало бы, что функция id всегда возвращает пустой набор узлов, сумма которых равна нулю. Вероятно, вам нужен полный DTD, а не только тот фрагмент, который я дал, и убедитесь, что вы включили проверку DTD в своем парсере. –

+0

Это не проблема, у меня есть рабочий файл DTD и XML, который проверяет – CodyBugstein

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