2012-04-02 26 views
0

我試圖通過參數樣式表中多個節點集通到在WSO2 ESB的XSLT調解員的XSLT。然而,當試圖引用在XSLT處理器中傳遞的參數時,這些值是字符串類型。如何傳遞在多個數據源到XSLT調解員在WSO2 ESB

的XSLT介體配置本身的結構是這樣的:

<xslt key="conf:/Test/TestMapping.xsl"> 
     <property xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns3="http://org.apache.synapse/xsd" name="originalMsg" expression="get-property('OriginalMsg')" /> 
    </xslt> 

在XSLT本身時傳遞的參數被用於嘗試是指元件在這個數據,例如

<xsl:value-of select="$originalMsg/ns1:Node/ns1:OtherNode"/> 

錯誤報告「/」操作在期望節點集時不能應用於字符串。

我曾嘗試通過在其上是由在流之前的步驟,這是我曾嘗試過各種medthods保存mesage體節點集:

通過富民介體:

<enrich> 
<source clone="true" type="body" xpath="" property="" /> 
<target action="replace" type="property" xpath="" property="OriginalMsg" /> 
</enrich> 

通過房產中介:

<property xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns3="http://org.apache.synapse/xsd" name="OriginalMsg" expression="$body" scope="default" type="OM" /> 

但這一直沒有奏效。

另外,有使用說明書()在ESB功能來指代消息上下文數據或一些其它方法的方法嗎?

+0

WS02支持哪種版本的XSLT?我懷疑它是版本1.在版本1中,您不能將XPath表達式應用於變量。您可以使用EXSLT的節點集等擴展,將字符串變量轉換爲節點集。如果你能看到你是否可以說服WS02使用像Saxon這樣的XSLT 2引擎,那麼它可能會更有成效,因爲XSLT版本2消除了版本1強加的許多惱人的限制 – Kevan 2012-04-02 17:42:32

回答

1

我工作圍繞這一問題,通過增加,我需要包括兄弟姐妹到郵件正文中的當前根元素,與富民調解員的附加XML數據的層次結構。

這樣就可以在XSLT中使用所有不同的數據。

然後在XSLT中介器配置中,我將源路徑設置爲$ body(即消息正文)而不是默認值(它是消息正文的第一個子元素),並在XSLT中將根元素添加爲SOAP Body元素本身。通過這種方式,消息體的所有孩子都被替換爲單個目標XML結構。

0

這是因爲在XSLT調解代碼:

private void applyProperties(Transformer transformer, MessageContext synCtx, SynapseLog synLog) { 

    for (MediatorProperty prop : properties) { 
     if (prop != null) { 
      String value; 
      if (prop.getValue() != null) { 
       value = prop.getValue(); 
      } else { 
       value = prop.getExpression().stringValueOf(synCtx); 
      } 
      if (synLog.isTraceOrDebugEnabled()) { 
       if (value == null) { 
        synLog.traceOrDebug("Not setting parameter '" + prop.getName() + "'"); 
       } else { 
        synLog.traceOrDebug("Setting parameter '" + prop.getName() + "' to '" 
          + value + "'"); 
       } 
      } 
      if (value != null) { 
       transformer.setParameter(prop.getName(), value); 
      } 
     } 
    } 

你可以看到,始終是一個字符串。我建議在注入變壓器之前爲屬性添加屬性的類型。

您認爲如何?