2015-05-20 3 views
1

Я хочу передать параметр в выражение XPath.Как передать параметр переменной в выражение XPath?

(//a/b/c[x=?],myParamForXAttribute) 

Могу ли я сделать это с помощью XPath 1.0? (Я пробовал string-join, но его нет в XPath 1.0)

Тогда как я могу это сделать?

Мой XML выглядит

<a> 
<b> 
    <c> 
    <x>val1</x> 
    <y>abc</y> 
    </c> 
    <c> 
    <x>val2</x> 
    <y>abcd</y> 
    </c> 
</b> 
</a> 

Я хочу, чтобы получить <y> значение элемента, где значение х элементов val1

Я попытался //a/b/c[x='val1']/y, но это не сработало.

+0

Если вы используете библиотеку Axiom, вы должны пометить свой вопрос Java и ожидать ответа, который включает в себя некоторую Java. –

+1

Вы начали с одной проблемы (как использовать переменные в выражениях XPath). Я [ответил на это ниже] (http://stackoverflow.com/a/30353346/290085). Теперь вы добавили еще одну проблему (ваш новый XPath, который не использует переменную и пытается выбрать * совершенно другой * элемент, не работает). Добавьте новый вопрос к своей новой проблеме и включите достаточную детализацию и контекст, чтобы воспроизвести вашу проблему - вы этого не сделали. – kjhughes

+0

Кстати, зачем беспокоиться с '// a/b/c'?Если вы перейдете ко всему удару производительности рекурсивного поиска (что глупо, но это то, что вы делаете, когда вы используете '//' вместо '/' для запуска), также можно использовать '// x [. = 'val1'] /../ y', и вам не нужно заботиться о 'a' или' b'. –

ответ

3

Учитывая, что вы используете библиотеку Axiom XPath, который, в свою очередь, использует Jaxen, вам необходимо выполнить следующие три шага, чтобы сделать это в тщательно прочном образом:

  • Создать SimpleVariableContext, и вызовите context.setVariableValue("val", "value1"), чтобы присвоить значение этой переменной.
  • На вашем объекте BaseXPath позвоните по номеру .setVariableContext(), чтобы передать его в указанном контексте.
  • Внутри вашего выражения используйте /a/b/c[x=$val]/y для ссылки на это значение.
+0

Можете ли вы опубликовать фрагмент кода в качестве примера для приведенного выше ответа. 'String xmlPayload =" имя1имя2 "; OMElement xmlOMOBject = AXIOMUtil.stringToOM (xmlPayload); SimpleVariableContext svc = new SimpleVariableContext(); svc.setVariableValue ("part1", key1); svc.setVariableValue ("part2", key2); Строка xpartString = "$ part1 $ part2"; DocumentNavigator nav = новый DocumentNavigator(); BaseXPath contextpath = new BaseXPath (xmlPayload, nav); contextpath.setVariableContext (svc); contextpath.selectSingleNode (xmlOMOBject); ' – user2694734

+0

выше код дает мне исключение – user2694734

+0

@ user2694734, было бы проще начать с полностью готового к воспроизведению воспроизведения. Может быть, поместить его в gist (https://gist.github.com/), чтобы позволить этому быть разветвленным любым, кто хочет предложить изменения? –

4

Это зависит от языка, на котором вы используете XPath.

В XSLT:

"//a/b/c[x=$myParamForXAttribute]" 

Следует отметить, что, в отличии от подхода выше, ниже три открыты для XPath injection attacks и никогда не должен использоваться с неконтролируемыми или ненадежными входами; чтобы избежать этого, используйте механизм, предоставляемый вашим языком или библиотекой, чтобы передавать переменные вне диапазона. [Credit: Charles Duffy]

В C#:

String.Format("//a/b/c[x={0}]", myParamForXAttribute); 

В Java:

String.format("//a/b/c[x=%s]", myParamForXAttribute); 

В Python:

"//a/b/c[x={}]".format(myParamForXAttribute) 
+0

Я редактировал свой вопрос с помощью моего xml. Пожалуйста, смотрите. x является дочерним элементом c – user2694734

+0

. Мой сценарий - это чистый Xpath. оцениваемый xpath отправляется в java-программу. Так что я хочу, чтобы это решение в чистом выражении xpath – user2694734

+0

Я обновил вопрос с помощью xpath Im пытается – user2694734