Como passar um documento XML como um parâmetro para um XSL transformar em java (XDK Oracle)?
-
18-09-2019 - |
Pergunta
Eu estou tentando passar um documento XML para uma folha de estilo XSLT como um parâmetro. Eu acredito que o código está usando o XDK oráculo para as transformações (ele está usando JDK 1.4.2 e Primavera, e eu sou novo para a base de código, então eu não tenho certeza do que está sendo carregado no final). Na minha primeira tentativa, Acabei de criar um objeto de documento e definir isso como o parâmetro no transformador, mas as tentativas para copiar a variável na árvore não dão resultado. Questões que vêm à mente são:
-
isso é mesmo possível no caso geral de transformadores XSLT? (Parece que ele deve ser, como geralmente XSLT variáveis ??/ parâmetros podem conter nodesets)
-
é possível especificamente com o XDK Oracle (ou xalan, que também está no caminho da classe)?
-
Se sim, como posso fazê-lo funcionar?
Solução
A resposta é que isso é possível, no entanto, é não-intuitivo, pelo menos para o processador do Oracle XSL. Eu tentei as seguintes invocações (não-trabalho) (nomes alterados para proteger os inocentes):
Document x = createDocumentForMe();
transformer.addParameter("param",x);
e
Document x = createDocumentForMe();
transformer.addParameter("param",new DOMSource(x));
(esta segunda na base de que talvez DOMSource iria funcionar porque era a interface java.xml.transform ao DOM). A invocação que funcionou para mim no final foi a tomar a percepção de que XSL usa XPath, e os tipos válidos para a variável são essencialmente cordas ou nodesets e XPath retorna nodesets. Os seguintes trabalhos para mim:
Document x = createDocumentForMe();
XPathExpression xpe = XPathFactory.newInstance().newXPath().compile("/");
transformer.addParameter("param",xpe.evaluate(x, XPathConstants.NODESET));
O que basicamente usa XPath para obter um conjunto de nós contendo apenas o documento raiz do passado no DOM objeto. No entanto, este parece ser um pouco de um truque, e pode não funcionar com outros processadores de XSL, então YMMV ...