2016-04-01 3 views
1

Я пытаюсь сделать основную вещь в Saxon HE 9.7 с помощью xquery. У меня есть xquery, который возвращает набор элементов. Затем я хочу запросить каждый элемент отдельно. Но я не могу понять, как сделать запрос только для этого элемента. Я думал, что setContextItem() будет делать трюк, но это не сработает.Как запросить результат запроса в Saxon xquery

Я создал простой пример, который иллюстрирует мою проблему. Я перебираю <element>, а затем хочу получить <name> для каждого элемента. Но мой запрос ничего не возвращает, потому что он фактически запрашивает полный xml, а не только элемент. Если я изменил внутренний запрос на //name, он вернет все теги имен в документе.

данные файла/example.xml:

<root> 
    <element> 
     <name>1</name> 
    </element> 
    <element> 
     <name>2</name> 
    </element> 
</root> 

Java код:

public static void main(String[] args) throws SaxonApiException 
{ 
    Processor proc = new Processor(false); 
    XPathCompiler xpath = proc.newXPathCompiler(); 
    DocumentBuilder builder = proc.newDocumentBuilder(); 
    XdmNode rootNode = builder.build(new File("data/example.xml")); 
    String xquery = "/root/element"; 
    XPathSelector selector = xpath.compile(xquery).load(); 
    selector.setContextItem(rootNode); 
    for (XdmItem item : selector) 
    { 
     xquery = "/element/name"; 
     XPathSelector selector2 = xpath.compile(xquery).load(); 
     selector2.setContextItem(item); 
     System.out.println("item=" + item); 
     if (selector2.iterator().hasNext()) 
      System.out.println("name=" + selector2.iterator().next()); 
     else 
      System.out.println("Not found"); 
    } 
} 

Моя Maven зависимость:

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>Saxon-HE</artifactId> 
    <version>9.7.0-4</version> 
</dependency> 

Результат:

item=<element> 
     <name>1</name> 
    </element> 
Not found 
item=<element> 
     <name>2</name> 
    </element> 
Not found 

ответ

3

В XPath / в начале всегда ссылается на узел документа. Если вы хотите, чтобы ваш XPath (тот внутри цикла) уважать контекст элемента, попытайтесь сделать это начинается с полной остановки (.):

xquery = "./name"; 

Или просто удалить / полностью *:

xquery = "name"; 

*) это будет работать для вашего случая, потому что child:: является осью по умолчанию, которая будет использоваться, если ни один из них не указан явно

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