我有一個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獨自做到這一點很容易,所以我已經沿着試過EqualTo
,NotEqualTo
,LogicalOR
,ValueMapping
的functoid的組合用腳本functoid(內聯C#)在輸入之間進行選擇(如果條件保持爲真),但沒有給我正確的輸出。
採用這種結構(圖像顯示)的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
元素不斷被忽略。
有人可以幫助我嗎?
謝謝丹!使用循環functoids的安排工作完美。 – JDoe
儘管爲了我自己的學習/理解,你能解釋這個XSLT問題嗎? - 您提供的XSLT模板無法使用,但不幸的是,我對XSLT中的模板不熟悉。我不斷收到2個錯誤,其中一個說QName「無效,即使我改變了命名空間,另一個說模板沒有名字,我知道QName是指合格的名字,但我並不真正知道你可以解釋一下這個嗎? – JDoe
這個模板必須重構一下才能在腳本functoid中使用 - 可能將它放在一個調用模板functoid中,並使用for-each代替一個匹配。 QName錯誤,但這可能是導致另一個錯誤的原因,我把這個模板作爲一個粗略的例子來說明它在完整的XSLT文件中的樣子 –