我正在尝试使用XSLT组件从XML进行动态转换。是否可以将URI中的java变量作为XSLT模板传递?
例如:
from("direct:foo").
to("xslt:${fee}").
to("direct:output");
foo - 是一个XML有效负载, fee - 存储为java.lang.String的XSLT模板, output - xml payload
答案 0 :(得分:2)
您可以根据以下条件将变量分配到邮件标题中:
.setHeader("TemplateLocation").constant("OSGI-INF/xsl/pretty.xsl")
之后,您可以使用收件人列表 EIP:
.recipientList().simple("xslt:${header.TemplateLocation}")
或者您可以使用 toD :
.toD("xslt:${header.TemplateLocation}")
工作示例:
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.routeId("xsltTest")
.log(LoggingLevel.INFO, "XML input : \n${body}")
.setHeader("TemplateLocation").constant("OSGI-INF/xsl/pretty.xsl")
//.recipientList().simple("xslt:${header.TemplateLocation}")
.toD("xslt:${header.TemplateLocation}")
.to("log:end?level=INFO&showAll=true&multiline=true");
}
};
}
据我所知,没有办法将字符串变量用作xslt模板。
答案 1 :(得分:0)
根据我的知识
您可以将其作为单独的文件,并像这样调用它 以( “XSLT:文件:///foo/bar.xsl”)。强>
有关详细信息XSLT
答案 2 :(得分:0)
您无法使用动态样式表(动态内容)与Camel的XSL组件。
您可以做的最有活力的是对静态文件的动态引用,如下所示:
.toD("xslt:${expressionWithFileReference}")
但是,您可以调用Java bean 来执行您想要的操作并从路径中调用它:
.bean(javaBeanReference or new YourJavaBean())
在Bean中,您可以使用Camel annotations将标题,属性和正文注入方法。无论您需要当前的Camel Exchange。
public void yourMethod(
@Header(headername) String parameterName,
@Body Type parameterName) {
...
}
答案 3 :(得分:0)
由于Camel不支持动态XSLT输入流,因此我必须创建自己的Transformer。这可能有助于某人
这是我的代码段。我使用了驼峰处理器,如下所示
@Override
public void process(Exchange exchange) throws Exception {
XmlMapper xmlMapper = new XmlMapper();
Target target = xmlMapper.readValue(transform(getInputStreamFromDocument(xmlPayload), new ByteArrayInputStream(xsltTemplate.getBytes())), target.class);
}
public byte[] transform(InputStream dataXML, InputStream inputXSL)
throws TransformerException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(inputXSL));
StreamSource in = new StreamSource(dataXML);
StreamResult out = new StreamResult(bos);
transformer.transform(in, out);
return bos.toByteArray();
}