2013-12-17 29 views
0

2年前,我問過這個問題(Problem with BizTalk multi-input map),但項目被擱置了,我從未做過任何進一步的測試。我不得不再次將它擦掉,還有一些細節和截圖。BizTalk HIPAA EDI多輸入映射不會生成節點

我有一個BizTalk HIPAA解決方案需要合併837索賠架構與我們的系統中的一些數據。我們正在與一個地圖有兩個輸入模式這樣做,如下所示:

enter image description here

(我已經大大簡化了用於測試目的的模式)。 對我原來的文章(使用相同的functoid和值映射器)的接受答案工作正常,像我最初顯示的簡單模式,但與實際的EDI模式失敗。

在第一個輸入消息中,如果IsRepriced = 1,我想將我們的值用於HCP_01,HCP_02和HCP_03。如果它是0,則使用第二條消息中的值(原始837聲明)。只要原始837聲明實際上包含HCP節點(片段),顯示的functoids就可以正常工作,但如果它不在那裏,我無法從我們的數據中生成一個。

用一些if-then-else C#代碼替換這些腳本functoid具有相同的效果。

那麼,有沒有辦法做到這一點使用functoids,還是我需要求助於XSLT?不幸的是,我幾乎不知道XSLT,所以這將是困難的...

謝謝!

編輯:我想起來使用內聯XSLT調用模板,使用此代碼:

<xsl:template name="Repricing_2000B_HCP"> 
<xsl:param name="IsRepriced" /> 
<xsl:choose> 
    <xsl:when test="$IsRepriced='1'"> 
<xsl:for-each select="//InputMessagePart_1/ns0:X12_00401_837_I/ns0:TS837Q3_2000A_Loop/ns0:TS837Q3_2000B_Loop/ns0:TS837Q3_2300_Loop/ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300"> 
<xsl:element name="ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300"> 
    <xsl:copy-of select="./@*" /> 
    <xsl:copy-of select="./*" /> 
</xsl:element> 
</xsl:for-each> 
    </xsl:when> 
    <xsl:otherwise> 
<xsl:for-each select="//InputMessagePart_0/ns0:X12_00401_837_I/ns0:TS837Q3_2000A_Loop/ns0:TS837Q3_2000B_Loop/ns0:TS837Q3_2300_Loop/ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300"> 
<xsl:element name="ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300"> 
    <xsl:copy-of select="./@*" /> 
    <xsl:copy-of select="./*" /> 
</xsl:element> 
    </xsl:for-each> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:template> 

回答

2

我經常撞了南牆與在地圖中如果缺別的paradign。有時候循環功能會執行這個技巧,有時候不會。有時一個仔細放置的邏輯存在 - >不起作用,有時不起作用。

這主要是因爲如果其中一個源記錄是minOccurs = 0,Mapper會將所有內容都包含在for-each中。由於元素不存在,因此代碼不會執行。

我說> 50%,我訴諸內聯Xslt,因爲在某些時候,它比一個主要是重複Functoid組的頁面更乾淨。

但是,我敢打賭,Xslt不會像你想象的那樣變成一個難題。 Mapper可以爲你做大部分工作。您可以使用Functoids構建大部分地圖,然後複製生成的Xslt。你將不得不修改一些東西,比如命名空間。

(相同的答案)

+0

是的,結束了xslt路線... –