1

我正在使用 BizTalk 映射器映射到 HL7 A31 消息。该映射有几个内联 XSLT 脚本 functoid。

当 XML 通过 HL7 发送管道时,会产生错误:

元素“ROL_11_OfficeHomeAddress”的结构无效

如果我查看挂起的消息,我可以明白为什么会发生这种情况。ROL_11 元素为空,如下所示:

    <ROL_11_OfficeHomeAddress>
    </ROL_11_OfficeHomeAddress>

在开始和结束标签之间,由于缩进,有一个换行符和几个空格/制表符。这与 XSLT 生成的完全一样,我相信是换行符导致了错误。

我可以将 XSLT 包装在一个<xsl:if>语句中,以便在编写 XML 之前检查一个值。然而,这个问题在很多地方都发生了,像这样包装每一个元素似乎有点矫枉过正。

我真正想要的是让 BizTalk 自动将元素转换为空元素,如下所示:

<ROL_11_OfficeHomeAddress />

我相信这会解决问题。有什么办法可以告诉它这样做吗?

我已经尝试过的事情:

  • 使用<xsl:strip-space>但这引发了它自己的错误。我认为这是因为 BizTalk 将内联 XSLT 包装在自己的代码中,因此在错误的位置指定了条形空间。

  • 更改地图的网格属性以将Indent设置为No,希望删除空格。这对挂起消息中看到的 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 可空元素映射中生成如下所示的 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 whitespace,除非您通过映射将其更改回<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 回答
1

我最近也遇到了这个问题,但在 BizTalk 2013 中。我们将所有内容移至自定义 XSLT 文件以映射我们的 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

主机设置中的一个选项,用于使用遗留空格为我们做了(至少到目前为止)。

于 2013-12-03T17:22:48.633 回答