BizTalk HL7 ошибка конвейера отправки из-за разрывов строк в пустых XML-элементах

Я сопоставляю сообщение HL7 A31 с помощью картографа BizTalk. На карте есть несколько встроенных скриптообразных XSLT-функций.

Когда 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 в свой собственный код, и, таким образом, пространство в полосе было указано в неправильном месте.

  • Измените свойства сетки карты, чтобы задать для параметра " Отступ" значение " Нет" в надежде на удаление пробела. Это никак не повлияло на XML, который мы видели в приостановленном сообщении.

  • Добавление раздела реестра для устаревшей обработки пробелов согласно данному руководству. Снова, это, казалось, не имело никакого эффекта вообще.

2 ответа

Решение

Если вы преобразуете всю свою карту в 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 element

    <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-файлы для отображения нашего 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

Опция в настройках Хоста для использования устаревших пробелов сделала это для нас (пока, по крайней мере).

Другие вопросы по тегам