2016-06-07 4 views
1

Я использую пакет Saxon s9api для поиска XPath.Java XPath - Limit Scope - Saxon s9api

Я хочу ограничить свой поиск только одним узлом и его потомками.

<root> 
    <b> 
     <a>foo</a> 
    </b> 
    <b> 
     <a>bar</a> 
    </b> 
</root> 

Я прошел/корень/б [2] в качестве XdmNode (bNode), и я пытаюсь искать под ним.

XPathSelector selector = new Processor(false).newXPathCompiler().compile(xPath).load(); 
selector.setContextItem(bNode); 
selector.evaluate() 

Но я всегда получаю результаты от корня документа!

Я попытался следующие XPaths:

  1. /B/A -> ничего не возвращает
  2. б/у -> ничего не возвращает
  3. ./b/a - > Возвращает ничего
  4. // b/a -> Возвращает оба элемента

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

ответ

1

Попробуйте ./a или просто a. Контекст уже ссылается на b, поэтому ваш номер XPath 3 ошибочно попытается найти вложенный b, которого не существует.

+0

Оба работали. Спасибо! И здесь я думал, что моя проблема связана с ** Java/Saxon **, а не ** XPath **. :/ – BrandonDude

+1

Чтобы усилить этот ответ: выражение пути, начинающееся с «/», ищет документ, содержащий элемент контекста, * не * поддерево, укорененное в элементе контекста. Для поиска поддерева, внедренного в элемент контекста, он должен начинаться с «./» (или просто с шага оси). –

0

В моем коде это выглядит так:

XPathFactory xPathfactory = XPathFactory.newInstance(); 
XPath xpath = xPathfactory.newXPath(); 
XPathExpression expr = xpath.compile(path); 
NodeList xpathResult = (NodeList) expr.evaluate(node, XPathConstants.NODESET); 

Последняя строка является интересным.

Я не уверен, что это саксон и/или правильная версия. Можем выстрелить :)

+0

Я использую Saxon, потому что он поддерживает до версии 3.1 XPath. – BrandonDude