2016-01-07 34 views
0

希望有人可以指出我眼中的這一點非常明顯 - 我想在發送到後端服務之前對soap有效負載執行一些簡單的翻譯 - 關鍵是,我需要訪問所有soap-在原始有效載荷中傳送的報頭。 我天真(?)的想法是簡單地將<xslt> mediator的源屬性設置爲「/」,因爲默認情況下它會從<body>的第一個子節點開始,我確實需要訪問標題。 WSO2返回「XPath表達式的評估/未導致OMNode」錯誤。WSO2 XSLT Mediator沒有解析xpath

在文獻中是否存在一個或多個WSO2/xpath交互操作怪癖?任何指針感激地收到,謝謝

回答

1

正如Tishan提到的,您可以使用$header突變xpath變量來訪問消息上下文中的肥皂標題。但是對於xslt mediator來說這有點棘手。您不能直接訪問xslt樣式表中的消息上下文值。但可以將這些值作爲參數傳遞並用於轉換。讓我們看看我們如何實現這一目標。

下面是account.xslt文件的外觀。請注意,有兩個參數叫PARAM_SSNPARAM_ACCT_NO用於爲<ssn></ssn>分配值和<accountNumber></accountNumber>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="PARAM_SSN"></xsl:param> 
    <xsl:param name="PARAM_ACCT_NO"></xsl:param> 
    <xsl:template match="/"> 
     <account xmlns="http://services.samples"> 
      <ssn> 
       <xsl:value-of select="$PARAM_SSN"></xsl:value-of> 
      </ssn> 
      <accountNumber> 
       <xsl:value-of select="$PARAM_ACCT_NO"></xsl:value-of> 
      </accountNumber> 
      <accountHolder> 
       <xsl:value-of select="//name"></xsl:value-of> 
      </accountHolder> 
     </account> 
    </xsl:template> 
</xsl:stylesheet> 
/_system/governance/transform/account.xslt

下一頁

上面保存在WSO2 ESB的註冊表文件是做轉型與帳戶樣品代理.xslt

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="TransformExample" 
     transports="https,http" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
     <xslt key="gov:/transform/account.xslt"> 
      <property name="PARAM_SSN" expression="$header/seccode"/> 
      <property name="PARAM_ACCT_NO" expression="$trp:acctNo"/> 
     </xslt> 
     <log level="custom"> 
      <property name="Transformed Payload" expression="$body"/> 
     </log> 
     </inSequence> 
     <outSequence> 
     <send/> 
     </outSequence> 
    </target> 
    <description/> 
</proxy> 

在這裏你可以看到裏面<xslt>調解員,我傳遞值TW o參數通過訪問消息上下文在xslt中定義。 PARAM_SSN的值取自肥皂標題,PARAM_ACCT_NO的值取自傳輸標題。這個由soapUI調用的代理服務具有低於有效負載。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
    <seccode>987654321</seccode> 
    </soapenv:Header> 
    <soapenv:Body> 
    <request> 
     <name>Indika Sampath</name> 
    </request> 
    </soapenv:Body> 
</soapenv:Envelope> 

另外我發送acctNo作爲傳輸標題與請求一起。一旦命中代理,您可以在控制檯中看到如下所示的轉換輸出日誌。

[2016-01-09 07:19:02,146] INFO - LogMediator Transformed Payload = <soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <account xmlns="http://services.samples"><ssn>987654321</ssn><accountNumber>123456789</accountNumber><accountHolder>Indika Sampath</accountHolder></account> 
    </soapenv:Body> 

希望這可以解決您的問題。

乾杯!

+0

在一定程度上解決問題,在我的情況下,我需要傳遞的不僅僅是價值,還有一個列表。我寧願傳遞完整的XML作爲參數,但不支持:( –