Я пытаюсь сделать основную вещь в 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