2016-01-14 82 views
2

我有一個EDI 810文件,我必須從中有條件地映射某些值來自兩個不同點重複SAC節點,在文件中。請注意,與SAC_3節點相比,SAC_2發生在較低級別。源文檔的樣品片段看起來像這樣:BizTalk 2010條件映射問題(從兩個不同的重複源節點到同一個目標節點)

<ns1:IT1Loop1> 
    <ns1:SLNLoop1> 
    <ns1:SAC_2> 
     <SAC01>C</ID> 
     <SAC05>3443</Name> 
     <SAC15>Service A</ID> 
    </ns1:SAC_2> 
    </ns1:SLNLoop1> 
    <ns1:SLNLoop1> 
    <ns1:SAC_2> 
     <SAC01>C</ID> 
     <SAC05>120</Name> 
     <SAC15>Service B</ID> 
    </ns1:SAC_2> 
    </ns1:SLNLoop1> 
    <ns1:SLNLoop1> 
    <ns1:SAC_2> 
     <SAC01>A</ID> 
     <SAC05>243</Name> 
     <SAC15>Service D</ID> 
    </ns1:SAC_2> 
    </ns1:SLNLoop1> 
</ns1:IT1Loop1> 
<ns1:IT1Loop1> 
    <ns1:SLNLoop1> 
    <ns1:SAC_2> 
     <SAC01>A</ID> 
     <SAC05>567</Name> 
     <SAC15>Service C</ID> 
    </ns1:SAC_2> 
    </ns1:SLNLoop1> 
    <ns1:SLNLoop1> 
    <ns1:SAC_2> 
     <SAC01>F</ID> 
     <SAC05>4558</Name> 
     <SAC15>Service M</ID> 
    </ns1:SAC_2> 
    </ns1:SLNLoop1> 
</ns1:IT1Loop1> 
<ns1:SACLoop2> 
    <ns1:SAC_3> 
    <SAC01>A</ID> 
    <SAC05>-1234</Name> 
    <SAC15>Adjustment</ID> 
    </ns1:SAC_3> 
</ns1:SACLoop2> 
<ns1:SACLoop2> 
    <ns1:SAC_3> 
    <SAC01>D</ID> 
    <SAC05>24567</Name> 
    <SAC15>Balance Forward</ID> 
    </ns1:SAC_3> 
</ns1:SACLoop2> 

這裏的條件是: 從SAC_2,我需要的SAC05(至Amount)和SAC15的值映射(以Description)元素,IF SAC_2/SAC01的值爲"C""A"。 從SAC_3,我需要的SAC05(至Amount)和SAC15的值映射(以Description)元素,IF SAC_3/SAC01具有值"C""A"SAC15 != "Balance Forward"。 因此,它應該生成儘可能多的"MeasureItems",因爲這些分段中的任何一個都滿足標準。 這裏是輸出應該是什麼樣子的樣本輸入:

<Root> 
    <HeaderItems> 
    ... 
    </HeaderItems> 
    <MeasureItems> 
    <Description>Service A</Description> 
    <Amount>3443</Amount> 
    </MeasureItems> 
    <MeasureItems> 
    <Description>Service B</Description> 
    <Amount>120</Amount> 
    </MeasureItems> 
    <MeasureItems> 
    <Description>Service D</Description> 
    <Amount>243</Amount> 
    </MeasureItems> 
    <MeasureItems> 
    <Description>Service C</Description> 
    <Amount>567</Amount> 
    </MeasureItems> 
    <MeasureItems> 
    <Description>Adjustment</Description> 
    <Amount>-1234</Amount> 
    </MeasureItems> 
    <ReadItems> 
    ... 
    </ReadItems> 
</Root> 

有沒有辦法通過唯一的functoid獨自做到這一點很容易,所以我已經沿着試過EqualToNotEqualToLogicalORValueMapping的functoid的組合用腳本functoid(內聯C#)在輸入之間進行選擇(如果條件保持爲真),但沒有給我正確的輸出。

圖片:http://i68.tinypic.com/2dj5d2c.jpg

採用這種結構(圖像顯示)的functoid我總是會得到一切正確地從SAC_2重複映射,但它會完全忽略SAC_3元素。

並且對於內聯XSLT,它總是僅從第一次出現的SAC_2段映射到每個重複的IT1Loop1父級。當然,它會再次完全忽略SAC_3元素。

這裏是我使用的內聯XSLT代碼的一個版本:

<xsl:element name = "Description"> 

    <xsl:choose> 
    <xsl:when test=".//*[local-name()='SAC_2']/SAC01 = 'C' or .//*[local-name()='SAC_2']/SAC01 = 'A'"> 
     <xsl:value-of select = ".//*[local-name()='SAC_2']/SAC15[preceding-sibling::SAC01='C' or preceding-sibling::SAC01='A']"/> 
    </xsl:when> 
    <xsl:when test=".//*[local-name()='SAC_3']/SAC01 = 'C' and not(.//*[local-name()='SAC_3']/SAC15 = 'Balance Forward')"> 
     <xsl:value-of select = ".//*[local-name()='SAC_3']/SAC15[preceding-sibling::SAC01='C' or preceding-sibling::SAC01='A']"/> 
    </xsl:when> 
    </xsl:choose> 

</xsl:element> 

我猜switch語句和循環,因爲他們在其他語言做不工作在XSLT方式相同。另外,我也通過內聯C#嘗試了相同的邏輯。它沒有產生正確的結果。

我很確定應該有一種方法可以使用內聯XSLT或其他自定義代碼解決方案來實現此目的。

此外,我不明白爲什麼SAC_3元素不斷被忽略。

有人可以幫助我嗎?

回答

1

你應該可以用循環functoid和一些邏輯functoid來做到這一點。連接ITLoop1SACLoop2作爲循環functoid的輸入,並將其輸出到目標中繼節點(MeasurementItems)。然後像SAC05SAC15到正確的目的地。最後,在地圖上添加一些Equals functoids,其中SAC1作爲輸入,'A'作爲第二個參數,並輸出到MeasurementItems。爲SAC1元素添加相同的functoid,另一個使用C作爲第二個輸入。有關更多信息,請參閱documentation

如果你想在XSLT中做到這一點,它將不得不生成整個MeasurementItems節點,這可能是也可能不是比它的價值更難(或者可能值得在XSLT中使用整個地圖)。你的模板看起來像這樣:

<xsl:template match="//ns1:SAC_2[SAC01='A' or SAC01='C'] | //ns1:SAC_3[(SAC01 = 'A' or SAC01= 'C') and SAC15 != 'Balance Forward']" xmlns:ns1='REPLACE_WITH_REAL_NAMESPACE'> 
    <Amount> 
    <xsl:value-of select="SAC05" /> 
    </Amount> 
    <Description> 
    <xsl:value-of select="SAC15" /> 
    </Description> 
</xsl:template> 
+0

謝謝丹!使用循環functoids的安排工作完美。 – JDoe

+0

儘管爲了我自己的學習/理解,你能解釋這個XSLT問題嗎? - 您提供的XSLT模板無法使用,但不幸的是,我對XSLT中的模板不熟悉。我不斷收到2個錯誤,其中一個說QName「無效,即使我改變了命名空間,另一個說模板沒有名字,我知道QName是指合格的名字,但我並不真正知道你可以解釋一下這個嗎? – JDoe

+0

這個模板必須重構一下才能在腳本functoid中使用 - 可能將它放在一個調用模板functoid中,並使用for-each代替一個匹配。 QName錯誤,但這可能是導致另一個錯誤的原因,我把這個模板作爲一個粗略的例子來說明它在完整的XSLT文件中的樣子 –

相關問題