2012-02-21 58 views
1

我正在使用BizTalk映射器映射到HL7 A31消息。該地圖有幾個內聯XSLT腳本functoid。由於空XML元素中的換行符導致BizTalk HL7發送管道錯誤

當XML通過放HL7發送管道,它會產生一個錯誤:

The element 'ROL_11_OfficeHomeAddress' has an invalid structure

如果我看掛起的消息,我可以看到,爲什麼出現這種情況。該ROL_11元素是空的,看起來是這樣的:

<ROL_11_OfficeHomeAddress> 
    </ROL_11_OfficeHomeAddress> 

的開始和結束標記之間,有一個換行符和若干空格/製表符由於縮進。這與XSLT生成的完全一樣,我相信這是導致錯誤的換行符。

我可以將XSLT包裝在<xsl:if>語句中,以在寫入XML之前檢查值。然而,這個問題發生在很多地方,看起來像這樣包裝每一個元素似乎過分。

我真正想要的是爲BizTalk的元素會自動轉換爲空單,這樣的:

<ROL_11_OfficeHomeAddress /> 

我相信這會解決這個問題。有什麼辦法可以告訴它這麼做嗎?

事情我已經嘗試:

  • 使用<xsl:strip-space>但提出了自己的錯誤。我認爲這是因爲BizTalk將內聯XSLT包裝在其自己的代碼中,因此strip-space被指定在錯誤的地方。

  • 改變地圖的網格屬性設置縮進沒有希望的空白將被刪除。這對暫停消息中看到的XML沒有影響。

  • 根據this guidance添加舊式空白處理的註冊表項。再一次,這似乎根本沒有效果。

回答

1

如果您轉換您entire map into XSLT,下面將去掉換行和空白,並留下一個空的標籤,如果沒有什麼,但空白:

<xsl:element name="ROL_11_OfficeHomeAddress"> 
    <xsl:if test="normalize-space(ROL_11_OfficeHomeAddress)"> 
    <xsl:value-of select="normalize-space(ROL_11_OfficeHomeAddress)" /> 
    </xsl:if> 
</xsl:element> 

編輯: 的Biztalk通常會產生XSLT就像一個典型的1以下內容:如果你沒有1的nillable元素映射

<xsl:variable name="var:v2" select="string(ns0:ROL_11_OfficeHomeAddress/@xsi:nil) = 'true'" /> 
    <xsl:if test="string($var:v2)='true'"> 
     <ns0:ROL_11_OfficeHomeAddress> 
     <xsl:attribute name="xsi:nil"> 
      <xsl:value-of select="'true'" /> 
     </xsl:attribute> 
     </ns0:ROL_11_OfficeHomeAddress> 
    </xsl:if> 
    <xsl:if test="string($var:v2)='false'"> 
     <ns0:ROL_11_OfficeHomeAddress> 
     <xsl:value-of select="ROL_11_OfficeHomeAddress/text()" /> 
     </ns0:ROL_11_OfficeHomeAddress> 
    </xsl:if> 

所以使用<xsl:strip-space>這意味着如果只有空格,元素將映射到<ROL_11_OfficeHomeAddress></ROL_11_OfficeHomeAddress>,除非您通過地圖將其更改回<xsl:element>

你可以嘗試什麼是使用呼叫模板,如下面(nodeXfrm是一個節點)

<xsl:template name="StripElement"> 
    <xsl:param name="nodeXfrm"></xsl:param> 
    <xsl:variable name="nodeName"> 
     <xsl:value-of select="local-name($nodeXfrm)"></xsl:value-of> 
    </xsl:variable> 
    <xsl:element name="{$nodeName}"> 
     <xsl:if test="normalize-space($nodeXfrm)!=''"> 
      <xsl:value-of select="$nodeXfrm/text()"/> 
     </xsl:if> 
    </xsl:element> 
</xsl:template> 

然後你的地圖中,你可以要求你以這種方式

需要剝離的每個元素的模板
<xsl:call-template name="StripElement"> 
    <xsl:with-param name="nodeXfrm" select="ROL_11_OfficeHomeAddress"></xsl:with-param> 
    </xsl:call-template> 

的XSLT大師也許能夠做到這一點更優雅

+0

非常感謝您的回答;我沒有想過把整個事情轉換成XSLT。我遇到的唯一問題是,我仍然必須將''測試添加到可能發生的所有地方。但是,如果將整個映射轉換爲XSLT,我可以使用''函數在全局範圍內執行此操作嗎?還是我誤解了它的目的? – 2012-02-21 14:42:11

+0

我上面編輯過 - 祝你好運! – StuartLC 2012-02-21 15:45:26

1

我也最近有這個問題,但在BizTalk 2013年我們搬到一切定製的XSLT˚F用於映射我們的HL7v2。升級到2013年時,突然之前工作的<xsl:strip-space>不再有效。

這是因爲BizTalk 2013現在使用XslCompiledTransform類而不是現在已廢棄的XslTransform類,它不允許<xsl:strip-space>。所以我也面臨着沒有全球化的方式去剝奪空白。

然而,經過一番搜索和撓頭,我發現了一個不起眼的博客中的東西,對於我的解決方案工作:

http://geekswithblogs.net/peterbrouwer/archive/2012/08/17/biztalk-2010ndashlegacy-whitespace-behaviour.aspx

在主機的設置選項,使用舊的空白做到了對我們來說(至少目前爲止)。

+0

偉大的發現,我搜索「遺留空白行爲」,並找到相關的MSDN文章:http://support.microsoft.com/kb/2786241。感謝您的回答! – 2013-12-04 09:03:42

相關問題