2011-01-06 41 views
0

我有一個地圖,需要2個輸入消息,例如:問題與BizTalk多輸入地圖

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

(節點的許多未示出,爲了清楚起見) 的輸出中的消息如下所示:

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

(這等同於InputMessagePart_1)

如果指示燈1,我想價值與的NewValue更換。如果它是0,我希望Value保持不變。我用了一個腳本functoid有這樣的代碼:

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

我遇到問題,是由於這樣的事實,值可能不是實際發生在原InputMessagePart_1 - 如果沒有,我要創建它。使用上面的腳本,即使Indicator是1,當Value不存在時,我也沒有收到返回字符串。

有什麼建議嗎?

更新:我做了一些進一步的測試,通過刪除if/then邏輯,並剛剛從functoid返回一個硬編碼的字符串,我得到了相同的結果......似乎只有空輸入殺死整個functoid的功能...

回答

0

您應該使用Equal functoid並測試值是否爲1。然後,您將結果養活兩個的functoid的輸入:

  • 首先,爲Value Mapping functoid的,它是連接到<New Value>標籤中源模式的第一部分。
  • 二,一個Logical Not functoid的,這是然後連接到另一個值映射functoid的連接到<Value>標籤在源模式的第二部分。

alt text

如果<Indicator>;標記不包含期望值1或者不存在於源消息中,則邏輯相等functoid將返回False,並且將執行映射的第二個分支。

Value標記是否存在於源模式的第二部分中並不重要。如果不是,則任何一個Value Mapping functoid都會在目標中創建它。

如果您確實需要依賴<Indicator>標記,則可能需要使用Logical Existence functoid,它返回源消息中是否顯示任何指定的輸入節點。

+0

要麼不工作,或者我沒有跟你說的話...我跑(從InputMessagePart_1)的值節點到邏輯存在functoid的,跑輸出到一個值映射functoid的。虛擬機的第二個輸入是Value節點。虛擬機的輸出進入的if/then腳本functoid(因爲我還需要看看指示燈是否1或0),但結果是一樣的 - 如果值節點不存在,我無法創建它與的NewValue填充它,當指示燈= 1 – 2011-01-06 19:26:23

0

如果一切都失敗使用映射器,你可以嘗試切換到XSLT - 看here如何刮XSLT出你現有的BTM的。

,你是後的地圖看起來簡單:

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