2014-02-20 36 views
0

問題: 我想添加一個uuid作爲傳入XML消息的新元素。我可以看到在記錄結果時添加了它,但是mule將它的名稱空間和java util uuid名稱空間添加到結果中,導致另一個服務在此處傳遞此消息,而不識別它,因爲它具有不包含它的名稱空間知道關於。Mule XSLT Transformer在轉換後添加命名空間

有沒有辦法配置xslt變壓器來實現我在這裏要做的事情?任何其他建議可能是另一種選擇?

目標是讓xslt生成一個uuid並標記到傳入的消息並傳遞給服務終點。 欣賞這方面的所有幫助。

騾配置:

<mule xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml" 
    xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" 
    xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" 
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:billing="http://mycompany.com/billing" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd 
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd"> 

    <mulexml:xslt-transformer name="xslt" 
    doc:name="XSLT"> 
    <mulexml:xslt-text> 
     <xsl:stylesheet version="2.0" xmlns:uuid="java:java.util.UUID"> 
     <xsl:variable name="uid" select="uuid:randomUUID()" /> 
     <xsl:template match="/"> 
      <xsl:apply-templates /> 
     </xsl:template> 

     <xsl:template match="node()|@*"> 
      <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="Request"> 
      <Request> 
      <xsl:apply-templates select="node()|@*" /> 
      <RequestId> 
       <xsl:value-of select="$uid" /> 
      </RequestId> 
      </Request> 
     </xsl:template> 
     </xsl:stylesheet> 
    </mulexml:xslt-text> 
    </mulexml:xslt-transformer> 

    <flow name="rsi_invoiceFlow1" doc:name="rsi_invoiceFlow1"> 
    <http:inbound-endpoint exchange-pattern="request-response" 
     address="${listener.hostname}:${listener.port}/${listener.path.invoice.rsi}" 
     doc:name="HTTP" transformer-refs="xslt" /> 


    <logger message="#[message.payloadAs(java.lang.String)]" level="ERROR" 
     doc:name="Logger" /> 

    <http:outbound-endpoint exchange-pattern="request-response" 
     method="POST" address="${destination.dev2.url}/" doc:name="HTTP" 
     doc:description="The '/' at the end of the URL is required on the RSI outbound call" /> 
    </flow> 
</mule> 

傳入XML:

<?xml version="1.0" encoding="UTF-8"?> 
<billing:RQ xmlns:billing="http://mycompany.com/billing"> 
    <Request> 
    <CallingHostOrWeblogicInstance>SOAPUI</CallingHostOrWeblogicInstance> 
    </Request> 

輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<billing:RQ xmlns:billing="http://mycompany.com/billing"> 
<Request xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:uuid="java:java.util.UUID"><CallingHostOrWeblogicInstance xmlns="">SOAPUI</CallingHostOrWeblogicInstance> 
<RequestId>bff3e1d6-ecdd-41ae-8807-ec04085a2b54</RequestId> 
</Request> 

回答

0

不要將您的XSL嵌入到Mule配置本身中,而是存儲在獨立文件中。你會避免命名空間污染,這是一個最佳做法。

1

XSLT將創建新的元素,該元素在有效的默認命名空間中沒有指定的命名空間。

在您的情況下,默認名稱空間聲明爲xmlns="http://www.mulesoft.org/schema/mule/core",因此您輸出的<Request>元素將位於該名稱空間中。

一種方法是完全避免默認名稱空間。請使用前綴xmlns:mule="http://www.mulesoft.org/schema/mule/core",然後使用<mule:mule>,<mule:flow>,<mule:logger>等。如果發現mule:太長,請使用m:

這可能是最乾淨的方法。無論如何,你已經使用了很多其他的命名空間,明確表示這個命名空間不會受到傷害。

另一種變體都將重新設置默認的命名空間的XSLT聲明空:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:uuid="java:java.util.UUID" 
    xmlns="" 
> 
    <!-- ... --> 
</xsl:stylesheet> 

你也可以使用<xsl:copy>而是明確創建一個新的<Request>的 - 但是你仍然有同樣的問題, <RequestId><RequestId xmlns="">會解決這個問題,但它相當難看,特別是如果它不是您創建的唯一元素。

如果您不想將XSLT外部化(如David所示),我建議使用「無默認名稱空間」方法。

0

在xsl:stylesheet元素上使用xmlns =「」來重置默認名稱空間。

在xsl:stylesheet元素中使用exclude-result-prefixes以避免其他mule名稱空間泄漏到樣式表中。

(你也可以使用XML 1.1「命名空間undeclarations」,它被髮明瞭這種目的,但我不會這麼做的:XML 1.1不是廣泛的支持不足,使技術穩健)

0

我嘗試了所有3條建議,我認爲從流配置中分離出來的轉換最適合我的情況,因爲它提供了最簡潔和解耦的方法來解決這個問題。

謝謝大家的回覆。