Я пытаюсь запустить XPath с «различными значениями», используя Saxon. Вот мой код:
@Test
public void testAttributeSelect() throws XPathFactoryConfigurationException {
System.setProperty("javax.xml.xpath.XPathFactory:"
+ NamespaceConstant.OBJECT_MODEL_SAXON,
"net.sf.saxon.xpath.XPathFactoryImpl");
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"net.sf.saxon.dom.DocumentBuilderFactoryImpl");
String xpathString = "distinct-values(//id)";
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
try {
DocumentBuilder builder = domFactory.newDocumentBuilder();
System.out.println(builder.getClass());
Document doc =
builder.parse(this.getClass().getResourceAsStream("parametrizedId_feed.xml"));
System.out.println(doc.getClass());
XPath xpath =
XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON).newXPath();
NodeList s1 = (NodeList)
xpath.evaluate("/matches", doc, XPathConstants.NODESET);
NodeList s = (NodeList)
xpath.evaluate(xpathString, s1 , XPathConstants.NODESET);
Я получаю это исключение:
javax.xml.xpath.XPathExpressionException: не удается найти реализацию объектной модели для узлов класса net.sf.saxon.dom.DOMNodeList в net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:300) в net.sf .saxon.xpath.XPathEvaluator.evaluate(XPathEvaluator.java:434) в ca.cbc.panacea.playground.TestXpath.testAttributeSelect(TestXpath.java:43) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect .NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
Файл jar Saxon-dom находится в пути к классам. Кроме того, если я попытаюсь вызвать «различные значения» непосредственно в объекте документа, я получу:
net.sf.saxon.trans.XPathException: для функции расширения требуется класс org.w3c.dom.NodeList; предоставленное значение класса net.sf.saxon.value.UntypedAtomicValue не может быть преобразовано в net.sf.saxon.dom.DOMObjectModel.convertXPathValueToObject(DOMObjectModel.java:395) в net.sf.saxon.dom.DOMObjectModel.access$000( DOMObjectModel.java:42) по адресу net.sf.saxon.dom.DOMObjectModel$5.convert(DOMObjectModel.java:166) по адресу net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:352) по адресу net.sf. saxon.xpath.XPathEvaluator.evaluate(XPathEvaluator.java:434)
Я не могу понять, что здесь происходит. И гугл тоже нет!