2016-03-02 172 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'提升一些 –