空のXML要素の改行によるBizTalkHL7送信パイプラインエラー
-
28-10-2019 - |
質問
BizTalkマッパーを使用してHL7A31メッセージにマッピングしています。マップには、いくつかのインラインXSLTスクリプト関数があります。
XMLがHL7送信パイプラインを通過すると、エラーが生成されます:
要素 'ROL_11_OfficeHomeAddress'の構造が無効です
一時停止されたメッセージを見ると、なぜこれが発生したのかがわかります。 ROL_11要素は空で、次のようになります。 ジェネラコディセタグプレ
開始タグと終了タグの間には、インデントのために改行といくつかのスペース/タブがあります。これはXSLTによって生成されたものとまったく同じであり、エラーの原因は改行であると思います。
XSLTを
<xsl:if>
ステートメントでラップして、XMLを書き込む前に値を確認することができます。ただし、この問題は多くの場所で発生しており、このようにすべての要素をラップするのはやり過ぎのようです。私が本当に望んでいるのは、BizTalkが要素を次のように自動的に空の要素に変換することです。 ジェネラコディセタグプレ
これで問題は解決すると思います。それを行うように指示できる方法はありますか?
私がすでに試したこと:
<xsl:strip-space>
を使用していますが、それ自体でエラーが発生しました。これは、BizTalkがインラインXSLTを独自のコードでラップしているため、ストリップスペースが間違った場所に指定されているためだと思います。空白が削除されることを期待して、マップのグリッドプロパティを変更してインデントをいいえに設定します。これは、一時停止されたメッセージに表示されるXMLには影響しませんでした。
このガイダンス。繰り返しますが、これはまったく効果がないように見えました。
解決
変換する場合
編集: Biztalkは通常、一般的な1:1のnillable要素マッピングで次のようなXSLTを生成します ジェネラコディセタグプレ
したがって、<xsl:strip-space>
を使用した場合、マップを通過して<ROL_11_OfficeHomeAddress></ROL_11_OfficeHomeAddress>
に戻さない限り、要素は空白のみの場合に<xsl:element>
にマップされることを意味します。
試すことができるのは、以下のような呼び出しテンプレートを使用することです(nodeXfrmはノードです) ジェネラコディセタグプレ
そして、マップ内で、この方法で削除する必要がある各要素のテンプレートを呼び出すことができます ジェネラコディセタグプレ
XSLTの第一人者はこれをよりエレガントに行うことができるかもしれません
他のヒント
私も最近この問題を抱えていましたが、BizTalk2013で。HL7v2をマッピングするためにすべてをカスタムXSLTファイルに移動しました。2013にアップグレードすると、以前は機能していた<xsl:strip-space>
が突然機能しなくなりました。
これは、BizTalk 2013が廃止されたXslTransformクラスではなくXslCompiledTransformクラスを使用し、<xsl:strip-space>
を許可しないためです。そのため、私も空白を取り除くグローバルな方法に直面していませんでした。
しかし、多くの検索と頭を悩ませた後、私は自分の解決策に役立つ何かを含むあいまいなブログ投稿を見つけました:
ホストの設定で、レガシー空白を使用するためのオプションが(少なくともこれまでのところ)それを行ってくれました。