2011-01-06 13 views
0

Ich habe eine Karte, die zwei Eingangsnachrichten nimmt, wie folgt aus:Problem mit BizTalk Multi-Input-Karte

<ns0:Root> 
    <InputMessagePart_0> 
     <root> 
     <Indicator>1</Indicator> 
     <NewValue>AAA</NewValue> 
     </root> 
    <InputMessagePart_0> 
    <InputMessagePart_1> 
     <root> 
     <Value>BBB</Value> 
     </root> 
    <InputMessagePart_1> 
</ns0:Root> 

(Viele der Knoten sind der Übersichtlichkeit halber nicht dargestellt) Die ouput Nachricht wie folgt aussieht:

<Root> 
    <Value>AAA</Value> 
</Root> 

(Es ist identisch mit InputMessagePart_1)

Wenn der Indikator 1 ist, lege ich Wert mit NewValue ersetzt werden soll. Wenn es 0 ist, möchte ich, dass Value gleich bleibt. Ich benutzte ein Skripterstellungsfunktoid mit Code wie folgt:

public string Get_Value(string indicator, string value, string newValue) 
{ 
    if(indicator == "1") 
    { 
     return newValue; 
    } 
    else 
    { 
     return value; 
    } 
} 

Ich laufe Probleme aufgrund der Tatsache, dass Wert möglicherweise nicht tatsächlich in der ursprünglichen InputMessagePart_1 auftreten - wenn dies nicht der Fall, ich will es schaffen. Mit dem obigen Skript, obwohl Indikator 1 ist, erhalte ich keine Rückgabezeichenfolge, wenn Wert nicht existiert.

Irgendwelche Vorschläge?

Aktualisiert: Ich habe einige weitere Tests durchgeführt, indem ich die if/then-Logik entfernt habe und nur eine hartcodierte Zeichenfolge aus dem Funktoid zurückgegeben habe, und ich bekomme die gleichen Ergebnisse ... es scheint, dass nur die leere Eingabe das Ganze tötet Funktionalität des Funktoids ...

Antwort

0

Sie sollten das Funktoid Equal verwenden und testen, ob der Wert 1 ist. Sie werden dann füttern das Ergebnis an den Eingang von zwei Funktoiden:

  • Zunächst auf eine Value Mapping Funktoid, die den <New Value> Tag im ersten Teil des Quellschemas verbunden ist.
  • Zweitens, zu einem Logical Not Funktoid, das ist dann mit einem anderen Wert zugeordnet Funktoid verbunden mit dem <Value> Tag im zweiten Teil des Quellschemas.

alt text

Wenn die <Indicator>; Das Tag enthält nicht den erwarteten Wert 1 oder ist in der Quellnachricht nicht vorhanden. Das Funktoid "Logisch gleich" gibt False zurück und der zweite Zweig der Map wird ausgeführt.

Es spielt keine Rolle, ob das Value-Tag im zweiten Teil des Quellschemas vorhanden ist. Ist dies nicht der Fall, erstellt eines der Funktoide für die Wertzuordnung es im Ziel.

Wenn Sie unbedingt auf das <Indicator>-Tag angewiesen sind, können Sie das Funktoid Logical Existence verwenden, das zurückgibt, ob ein angegebener Eingabeknoten in der Quellnachricht angezeigt wird.

+0

Entweder das nicht funktioniert, oder ich nicht folgen, was Sie sagen ...Ich führte den Value-Knoten (aus InputMessagePart_1) in das Funktoid "Logische Existenz" und führte die Ausgabe in ein Funktoid "Wertemapping" aus. Der zweite Eingang der VM ist der Value-Knoten. Die Ausgabe der VM geht in das if/then Scripting-Funktoid (da ich noch schauen muss, ob Indicator 1 oder 0 ist), aber das Ergebnis ist das gleiche - wenn der Value-Knoten nicht existiert, kann ich nicht erstellen es und füllen Sie es mit NewValue wenn Indikator = 1. –

+0

Nein, Indikator wird immer in der Spitze der beiden Schemas vorhanden sein - Wert ist optional im unteren Schema, aber ich werde versuchen, wie Sie vorgeschlagen ... –

+0

Ich habe das versucht und während es auf einem vereinfachten Testschema funktioniert, schlägt es fehl, wenn ich es auf das reale Ding anwende, wahrscheinlich, weil ich es mit einem Schleifen-HIPAA-Schema zu tun habe. Ich war bereit, einen Screenshot zu posten, aber der Ruf ist nicht hoch genug ... Sobald ich das unterste Wert-Mapping mit dem Ziel verbunden habe, verliere ich es ... lösche die Verbindung und es funktioniert gut. Aber ich denke, dass ich zumindest in eine bessere Richtung gehe. –

0

Wenn alles andere mit dem Mapper fehlschlägt, könnten Sie versuchen, zu XSLT zu wechseln - siehe here, wie Sie das XSLT aus Ihrem vorhandenen BTM extrahieren.

Die Karte, die Sie nach sind schaut einfach:

<?xml version="1.0" encoding="utf-16"?> 
<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > .. etc ... whatever you've scraped out 
    <xsl:output ... 
    <xsl:template match=...> 

<ns1:Root> 
<ns1:Value> 
    <xsl:choose> 
     <xsl:when test="/ns0:Root/ns0:InputMessagePart_0/ns0:root/ns0:Indicator/text()='1'"> 
      <xsl:value-of select="/ns0:Root/ns0:InputMessagePart_0/ns0:root/ns0:NewValue/text()" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="/ns0:Root/ns0:InputMessagePart_1/ns0:root/ns0:Value/text()" /> 
     </xsl:otherwise> 
    </xsl:choose> 
<ns1:Value> 
</ns1:Root>