Как я могу передать несколько источников данных в посредник XSLT в WSO2 ESB - PullRequest
0 голосов
/ 02 апреля 2012

Я попытался передать несколько наборов узлов в XSLT в посреднике XSLT в WSO2 ESB через параметры таблицы стилей.Однако при попытке обратиться к параметрам, передаваемым процессору 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" />

Но это не сработало.

В качестве альтернативы, есть ли способ использовать document () в функции ESB для ссылки на данные контекста сообщения или некоторые другиедругой подход?

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Я обошел эту проблему, добавив дополнительные иерархии данных XML, которые мне нужно было включить в качестве братьев и сестер, к текущему корневому элементу в теле сообщения с помощью посредника Enrich.

Это позволило всем различным данным быть доступными в XSLT.

Затем в конфигурации посредника XSLT я установил исходный путь в $ body (т.е. тело сообщения), а не в значение по умолчанию (которое является первым дочерним элементом тела сообщения), и добавил элемент Body SOAP в качестве корневого элемента в самом XSLT. , Таким образом, все дочерние элементы тела сообщения были заменены единственной целевой структурой XML.

0 голосов
/ 26 ноября 2012

Это потому, что в коде посредника 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);
            }
        }
    }

Вы видите, что значение всегда является строкой.Я предлагаю добавить для свойств тип свойства перед введением в преобразователь.

Что вы думаете?

...