Как передать XML-документ в качестве параметра преобразованию XSL в java (oracle xdk)?
-
18-09-2019 - |
Вопрос
Я пытаюсь передать XML-документ в таблицу стилей XSLT в качестве параметра.Я полагаю, что код использует oracle XDK для преобразований (он использует JDK 1.4.2 и Spring, и я новичок в кодовой базе, поэтому я не уверен, что загружается в конце).В моей первой попытке я просто создал объект document и установил это в качестве параметра в transformer, но попытки скопировать переменную в дерево не дают результата.Вопросы , которые приходят на ум, следующие:
возможно ли это вообще в общем случае XSLT-трансформаторов?(похоже, так и должно быть, поскольку обычно переменные / параметры XSLT могут содержать наборы узлов)
возможно ли это конкретно с oracle XDK (или xalan, который также находится в classpath)?
Если да, то как мне заставить это работать?
Решение
Ответ заключается в том, что это возможно, однако это неинтуитивно, по крайней мере, для процессора Oracle XSL.Я попробовал следующие (нерабочие) вызовы (имена изменены, чтобы защитить невинных):
Document x = createDocumentForMe();
transformer.addParameter("param",x);
и
Document x = createDocumentForMe();
transformer.addParameter("param",new DOMSource(x));
(на этот раз на том основании, что, возможно, DOMSource сработал бы, потому что это был интерфейс java.xml.transform для DOM).Вызов, который в конце концов сработал для меня, заключался в том, чтобы понять, что XSL использует XPath, а допустимые типы для переменной по сути являются строками или наборами узлов, а XPath возвращает наборы узлов.Для меня работает следующее:
Document x = createDocumentForMe();
XPathExpression xpe = XPathFactory.newInstance().newXPath().compile("/");
transformer.addParameter("param",xpe.evaluate(x, XPathConstants.NODESET));
Который в основном использует XPath для получения набора узлов, содержащего только корневой документ переданного в DOM объекта.Однако это похоже на небольшой взлом и может не работать с другими процессорами XSL, поэтому YMMV...