2012-04-02 5 views
0

WSO2 ESBのXSLTメディエータのXSLTに複数のノードセットをスタイルシートのパラメータで渡そうとしました。しかし、XSLTプロセッサで渡されたパラメータを参照しようとすると、値は文字列型であると言われます。渡されたパラメータは、例えば、このデータの要素を参照しようとするために使用されるときXSLT自体で複数のデータソースをWSO2のXSLTメディエータに渡す方法ESB

<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メディエータ自体をconfigのは、このように構成されています

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

エラーは、ノードセットが必要なときに "/"操作を文字列に適用できないことを報告します。

私は保存するために、様々なmedthodsを試みたフローの前のステップからのメッセージを指定の本体であるノードセットを渡すことを試みた:エンリッチメディエーターを介して

:スルー

<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関数でdocument()を使用してメッセージコンテキストデータなどを参照する方法がありますか?

+0

WS02はどのバージョンのXSLTをサポートしていますか?私はバージョン1だと思う。バージョン1では、変数にXPath式を適用することはできない。文字列変数をノードセットに変換するEXSLTのノードセットなどの拡張機能を使用することができます。 XSLTバージョン2は、バージョン1で課せられた多くの迷惑な制限を取り除くため、SaxonなどのXSLT 2エンジンを使用するようにWS02を説得できるかどうかを確認することができます – Kevan

答えて

1

私は、メッセージボディ内の現在のルート要素にEnrichメディエータで追加する必要がある追加のXMLデータ階層を追加することでこの問題を回避しました。

これにより、すべての異なるデータをXSLTで使用できるようになりました。

XSLTメディエータの設定では、デフォルト値(メッセージ本文の最初の子)ではなく$ body(つまりメッセージ本文)に設定し、XSLTのルート要素としてSOAP Body要素を追加しました自体。このようにして、メッセージ本体のすべての子が単一のターゲットXML構造に置き換えられました。

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); 
      } 
     } 
    } 

あなたはが常に文字列であることがわかります:XSLTメディエーターコードであるため

0

です。私は、変圧器に注入する前にプロパティの型をプロパティに追加することを提案します。

あなたはどう思いますか?

関連する問題