0

スタイルシートへのパラメーターを介して、WSO2 ESB の XSLT メディエーターで複数のノードセットを XSLT に渡そうとしました。ただし、XSLT プロセッサで渡されたパラメーターを参照しようとすると、値が文字列型であると表示されます。

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"/>

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

フローの前のステップからのメッセージ本文であるノードセットを渡そうとしました。これを保存するためにさまざまな方法を試しました。

Enrich メディエーターを介して:

<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() を使用してメッセージ コンテキスト データまたはその他のアプローチを参照する方法はありますか?

4

2 に答える 2

1

Enrich メディエーターを使用して、メッセージ本文内の現在のルート要素に兄弟として含める必要がある追加の XML データ階層を追加することで、この問題を回避しました。

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

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

于 2012-04-02T19:52:06.200 に答える
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);
            }
        }
    }

は常に文字列であることがわかります。トランスフォーマーに注入する前に、プロパティにプロパティの型を追加することを提案します。

どう思いますか?

于 2012-11-26T11:03:51.077 に答える