2016-03-02 171 views
1

我正在使用camel将消息路由到Web服务。消息类似于XML,但没有名称空间/前缀。现在的问题是Web服务期望XML,但是每个元素都有适当的名称空间。因此,作为一个例子:将名称空间和前缀添加到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),这是否会起作用?我正在尝试这个,但还没有成功。

还是有人有不同的想法?我的项目中也有XSD和JAXB注释类,因此这些也可以使用,并且消息与缺少的命名空间不同。

问候

托马斯

+0

尝试使用相同XSD用于输出。然后,接收请求时名称空间已经准备就绪。另一种选择是将请求映射到响应。我总是使用XmlBeans从XSD生成一个Jar。 –

+0

骆驼路由即时通讯使用,你可以认为它是一种旧系统的适配器(通过tcp发送没有命名空间的XML)和一个新系统(通过Web服务SOAP接收正确的XML)旧和新系统不能改变。 所以我必须在我的适配器/骆驼路线中解决这个问题。 编辑(也编辑了与该信息的问题):消息是相同的,除了名称空间 – horus

+0

“*如果它是相同的命名空间在所有元素上,我只是用一个xslt来添加它,但其大多数是2或3不同的名称空间。“为什么你不使用XSLT? (如果你不想使用它,为什么你的问题被标记为'xslt'?) –

回答

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> 
+0

是否有可能拥有ns1:使用这种解决方案的元素无需在模板匹配中全部命名它们?像' ...' 但我认为这也包括根元素吧? 然后只是分别对每个具有不同名称空间的模板进行匹配,这样我可以在不同的消息中共享xslt。 – horus

+0

当然,你可以使用更通用的匹配,并避免命名每个元素名称。如果您不想修改文档元素,请为标识模板添加特定路径(即'match =“/ * | @ * | node()”')。根据模板匹配模式的组合,您可能需要使用'@ priority'提升一些 –