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>
, Поэтому я тоже не столкнулся с каким-либо глобальным способом удаления пробелов.
Тем не менее, после долгих поисков и расчесывания голов я обнаружил непонятное сообщение в блоге с тем, что сработало для моего решения:
Опция в настройках Хоста для использования устаревших пробелов сделала это для нас (пока, по крайней мере).