我正在使用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,所以这些也可以使用,消息与缺少的命名空间相同。
最好的问候
托马斯
答案 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>