1

BizTalk マッパーを使用して HL7 A31 メッセージにマッピングしています。マップには、いくつかのインライン XSLT スクリプト Functoid があります。

XML が HL7 送信パイプラインを通過すると、次のエラーが生成されます。

要素「ROL_11_OfficeHomeAddress」の構造が無効です

中断されたメッセージを見ると、なぜこれが起こったのかがわかります。ROL_11 要素は空で、次のようになります。

    <ROL_11_OfficeHomeAddress>
    </ROL_11_OfficeHomeAddress>

開始タグと終了タグの間には、インデントのために改行といくつかのスペース/タブがあります。これは XSLT によって生成されたものとまったく同じであり、エラーの原因は改行だと思います。

<xsl:if>XML を記述する前に値をチェックするステートメントで XSLT をラップすることができます。ただし、この問題は多くの場所で発生しており、このようにすべての要素をラップするのはやり過ぎのようです。

私が本当に欲しいのは、BizTalk が次のように要素を空の要素に自動的に変換することです。

<ROL_11_OfficeHomeAddress />

これで問題は解決すると思います。そうするように伝える方法はありますか?

私がすでに試したこと:

  • but を使用<xsl:strip-space>すると、独自のエラーが発生しました。これは、BizTalk がインライン XSLT を独自のコードでラップしているため、strip-space が間違った場所に指定されたためだと思います。

  • マップのグリッド プロパティを変更して、空白が削除されることを期待してIndentNoに設定します。これは、中断されたメッセージに表示される XML には影響しませんでした。

  • このガイダンスに従って、従来の空白処理用のレジストリ キーを追加します。繰り返しますが、これはまったく効果がないように見えました。

4

2 に答える 2

1

マップ全体を 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>if 空白のみにマップされることを意味します<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 の第一人者は、これをよりエレガントに行うことができるかもしれません

于 2012-02-21T14:11:17.010 に答える