将命名空间和前缀添加到xml

时间:2016-03-02 14:01:44

标签: java xml xslt jaxb apache-camel

我正在使用camel将消息路由到Web服务。消息类似于XML但没有名称空间/前缀。现在的问题是Webservice需要XML,但每个元素都有适当的命名空间。举个例子:

<a>
  <b>value_b</b>
  <c>value_c</c>
</a>

即将进入,但需要发送的内容应该是这样的

<a  xmlns:n1="http://yadda-ns1.com" xmlns:n2="http://yadda-ns2.com">
  <ns1:b>value_b</ns1:b>
  <ns2:c>value_c</ns2:c>
</a>

如果它是所有元素上的相同命名空间,我会使用xslt来添加它。但它主要是2或3个不同的命名空间。

现在可以在我的驼峰路线中添加命名空间吗?我有想法使用jaxb来编组从“不完整”的XML到“完整”的XML(使用XML),这会有用吗?我试过这个但是还没有成功。

或者有人有不同的想法吗?我的项目中还有XSD和JAXB Annotated Classes,所以这些也可以使用,消息与缺少的命名空间相同。

最好的问候

托马斯

1 个答案:

答案 0 :(得分:0)

您可以使用下面的样式表转换XML,以修改要绑定到相应名称空间的元素:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:ns1="http:yadayada-ns1.com"
    xmlns:ns2="http:yadayada-ns2.com">
    <xsl:output indent="yes"/>

    <!-- identity template that copies content(unless more specific templates match) -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- Make the "a" elements in the ns1 namespace -->
    <xsl:template match="a">
        <xsl:element name="ns1:{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

    <!-- Make the "b" and "c" elements in the ns2 namespace -->
    <xsl:template match="b|c">
        <xsl:element name="ns2:{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>