2012-02-21 4 views
1

BizTalkマッパーを使用してHL7 A31メッセージにマッピングしています。このマップには、いくつかのインラインXSLTスクリプトFunctoidがあります。 XMLは、HL7通されBizTalk HL7は、空のXML要素の改行によりパイプラインエラーを送信します。

は、パイプラインを送る、それがエラーを生成します。

The element 'ROL_11_OfficeHomeAddress' has an invalid structure

私は中断メッセージを見れば、これが起こった理由を、私は見ることができます。 ROL_11要素が空で、次のようになります。開始タグと終了タグの間に

<ROL_11_OfficeHomeAddress> 
    </ROL_11_OfficeHomeAddress> 

、改行やインデントによるには、いくつかの空白/タブがあります。これはXSLTによって生成されたのとまったく同じです。私はそれがエラーの原因となっている改行であると信じています。

<xsl:if>ステートメントでXSLTをラップして、XMLを書き込む前に値をチェックすることができます。しかし、この問題は多くの場所で発生しており、このようなすべての要素をラップするのは難しいようです。

<ROL_11_OfficeHomeAddress /> 

私はこの問題を解決するだろうと信じて:のBizTalkは自動的に空のいずれかに要素を変換するために、私が本当に欲しい

はこのように、あります。私はそれをするためにそれを言うことができる方法はありますか? <xsl:strip-space>を使用して

  • それは、独自のエラーが発生した:

    物事は私はすでに試してみました。これは、BizTalkがインラインXSLTを独自のコードでラップし、ストリップスペースが間違った場所に指定されたためです。空白が削除されるだろう期待してインデントにありませんを設定するマップのグリッドプロパティを変更

  • 。これは中断されたメッセージに見られる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通常は1:1のNillable要素マッピングで、次のようなXSLTを生成します。

<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の第一人者は、私も最近、この問題を抱えていたが、のBizTalk 2013年に私たちは、カスタムXSLT Fにすべてを移動し、よりエレガントに

+0

ありがとうございます。私はすべてをXSLTに変換することを考えていませんでした。私が持っている唯一の問題は、これが起こる可能性があるすべての場所に ''テストを追加する必要があることです。しかし、マップ全体をXSLTに変換すると、 ''関数を使ってこれをグローバルに行うことはできますか?あるいは私はその目的を誤解していますか? –

+0

私は上記を編集しました - 幸運! – StuartLC

1

これを行うことができるかもしれません私たちのHL7v2をマッピングするためのiles。 2013年にアップグレードすると、以前働いていた<xsl:strip-space>が突然機能しなくなりました。

これは、BizTalk 2013では、現在は廃止されたXslTransformクラスではなくXslCompiledTransformクラスが使用され、<xsl:strip-space>は許可されないためです。だから、私も空白を取り除く世界的な方法に直面していませんでした。

はしかし、多くの検索や頭を掻くた後、私は私の解決策のために働いていた何かを持つ無名のブログの記事を見つけました:

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

レガシー空白を使用するためのホストの設定内のオプションは、それをやりました私たちのために(これまでは少なくとも)。

+0

偉大な発見、私は "レガシー空白の動作"を検索し、関連するMSDNの記事:http://support.microsoft.com/kb/2786241を発見した。ご回答有難うございます! –