在不使用 XSLT 的情况下在 Apache Camel Route 中使用 JAXB 从一种 XML 格式转换为另一种 XML 格式

Transformation From One XML to Another XML Format Using JAXB in Apache Camel Route without using XSLT

我有请求 xml 被目标系统使用。目标系统 accpets XML 但格式为 different.So 我需要构建编组和解组逻辑以使数据在我通往目标系统的路径中流动。那么有什么方法可以在不使用推土机或 XSLT

的情况下使用 Java bean 方法或 jAXB 来实现

带 Springboot 的 Apache Camel

这是进行 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>

因此您可以通过 camel 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.