2012-04-02 7 views
0

Ich habe versucht, mehrere Knotensets in einem XSLT-Vermittler in WSO2 ESB über Parameter an das Stylesheet zu übergeben. Wenn Sie jedoch versuchen, auf die im XSLT-Prozessor übergebenen Parameter zu verweisen, wird angegeben, dass die Werte Zeichenfolgetypen sind.Wie kann ich mehrere Datenquellen in einen XSLT-Mediator in WSO2 einbinden? ESB

Der XSLT Mediators selbst Config ist wie folgt strukturiert:

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

im XSLT selbst wenn der übergebenen Parameter auf ein Element in diesen Daten zu beziehen, um zu versuchen verwendet wird, z.B.

Der Fehler meldet, dass die Operation "/" nicht auf eine Zeichenfolge angewendet werden kann, wenn ein Knotenset erwartet wird.

Ich habe auf dem nodeset passieren versucht, die der mesage Körper aus einem vorherigen Schritt in der Strömung, die ich verschiedene medthods versucht haben, zu speichern:

Durch Enrich Vermittler:

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

Durch Immobilienvermittler:

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

Aber das hat nicht funktioniert.

Oder gibt es eine Möglichkeit, document() in der ESB-Funktion zu verwenden, um auf Nachrichtenkontextdaten oder eine andere Methode zu verweisen?

+0

Welche Version von XSLT unterstützt WS02? Ich vermute, es ist Version 1. In Version 1 können Sie XPath-Ausdruck nicht auf Variablen anwenden. Sie können möglicherweise Erweiterungen wie den Knotensatz von EXSLT verwenden, der eine Zeichenfolgenvariable in einen Knotensatz verwandelt. Es kann jedoch produktiver sein, wenn Sie sehen können, ob Sie WS02 überzeugen können, eine XSLT 2-Engine wie Saxon zu verwenden, da XSLT Version 2 viele lästige Einschränkungen von Version 1 beseitigt – Kevan

Antwort

1

Ich habe dieses Problem behoben, indem ich die zusätzlichen XML-Datenhierarchien, die ich als Geschwister in das aktuelle Stammelement innerhalb des Nachrichtentexts einfügen musste, mit dem Enrich-Mediator hinzufügte.

Dadurch konnten alle verschiedenen Daten im XSLT verfügbar sein.

Dann in XSLT Mediator-Konfiguration ich den Quellpfad zu $ ​​body (dh der Nachrichtentext) anstatt den Standardwert (die erste untergeordnete Nachricht Nachricht) und ein SOAP-Body-Element als Root-Element in der XSLT hinzugefügt selbst. Auf diese Weise wurden alle untergeordneten Elemente des Nachrichtenkörpers durch die einzelne Ziel-XML-Struktur ersetzt.

0

Dies liegt daran, im XSLT-Mediator-Code:

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

können Sie sehen, dass Wert ist immer ein String. Ich schlage vor, für die Eigenschaften den Typ der Eigenschaft vor dem Einspeisen in den Transformator hinzuzufügen.

Was denkst du?