在Apache Camel Route中使用JAXB从一种XML转换为另一种XML格式,而无需使用XSLT

时间:2019-06-11 12:43:37

标签: apache-camel marshalling unmarshalling spring-dsl

我有请求xml,目标系统使用了它。目标系统支持XML,但格式不同。因此,我需要构建编组和解组逻辑,以使数据在到达目标系统的路径中流动。因此,有什么方法可以使用Java bean方法或jAXB而不使用推土机或XSLT

带有Springboot的Apache Camel

1 个答案:

答案 0 :(得分:0)

这是进行XSLT转换的非常快速和简单的方法。

假设您的源数据如下:

<?xml version="1.0"?>
<root>
  <elem1 id="1">
    <child1>Hello</child1>
    <child2>World</child2>
  </elem1>
</root>

您可以拥有一个看起来像这样的XSLT转换文件:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="elem1">
    <div>
      <h1>Section <xsl:value-of select="@id" /></h1>
      <p><xsl:value-of select="child1" /></p>
      <p><xsl:value-of select="child2" /></p>
    </div>
  </xsl:template>
  <xsl:template match="@*|node()"> <!-- identity transform -->
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

例如,然后您通过骆驼xslt转换将其传递给其他人,例如

from("direct:start")
  .to("xslt:myTransformFile.xsl&saxon=true")
  .to("direct:end")

然后您应该将以下XML消息传递给direct:end

<?xml version="1.0"?>
<root>
  <div>
    <h1>Section 1</h1>
    <p>Hello</p>
    <p>World</p>
  </div>
</root>

因为身份模板已复制了与另一个模板不匹配的任何元素,并且该模板用模板的内容替换了与选择标准匹配的任何元素。在这种情况下,elem1被模板的内容替换。 <xsl:value-of ... />元素被解释,但是任何不以<xsl:...开头的元素只是输出的一部分。

有关XSLT的简单介绍,可以在这里查看:https://www.w3schools.com/xml/xsl_intro.asp