骆驼XSLT转型

时间:2018-03-29 21:14:36

标签: xslt apache-camel xslt-1.0 transform xslt-2.0

我正在尝试使用XSLT组件从XML进行动态转换。是否可以将URI中的java变量作为XSLT模板传递?
例如:

from("direct:foo").
  to("xslt:${fee}").
  to("direct:output");

foo - 是一个XML有效负载,   fee - 存储为java.lang.String的XSLT模板,   output - xml payload

4 个答案:

答案 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轮询器具有动态表达式作为子目录($ {fee})。 据我所知,你不能在Camel中拥有动态地址 路线。因为这意味着你可以从多个消费 端点。

您可以将其作为单独的文件,并像这样调用它  以( “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();
    }