Использование контента из одного узла XML в качестве документа XML, в то же время продвигая узлы XML на одном уровне
Я получаю XML-документ, который содержит еще один XML-документ внутри одного из его узлов, как показано в приведенной ниже структуре:
<NewTable>
<conversationID>f5296f48-90b4-4370-8f16-0115a105c161</conversationID>
<hostUTC>2018-11-20T16:29:36.04Z</hostUTC>
<msgType>INVOIC</msgType>
<msgFormat>oioUBL</msgFormat>
<msgbody>OTHER XML DOCUMENT...</msgbody>
<fromID>GLN:5790012328619</fromID>
<toID>KMDoioUBL</toID>
</NewTable>
Я думал об использовании схемы Envelope, но в моем случае я не могу просто использовать тег как дочерний элемент для узла NewTable. Мне не нужна схема для XML в теге msgbody, она должна быть просто отправлена в виде сквозной передачи. Мне нужно продвинуть некоторые другие узлы XML, такие как msgType, чтобы их можно было использовать для фильтрации документа в Biztalk, при этом отправляя только содержимое в теге msgbody.
Возможен ли этот сценарий с использованием схемы конвертов в Biztalk?
1 ответ
Я полагаю, это связано с вашим вопросом. Извлечение XML-документа из узла XML из сообщения WCF-SQL с использованием выражения пути к телу
Первое, что вам, вероятно, нужно сделать, это удалить любые Min Occurs или Max Occurs из любого из узлов, чтобы они встречались только 1. Затем вы можете продвигать свойства, которые хотите сохранить, в контексте вашего сообщения.
Следующей частью будет извлечение части msgbody, в предыдущем вопросе ответом было использование XPath для извлечения части тела в адаптере, но тогда вы потеряете эти заголовки до того, как они пройдут через XML дизассемблер, а не вместо этого вы захотите создать карту, чтобы извлечь ее для вас.
Просто создайте карту, в которой вход и выход настроен на вашу схему, создайте ссылку с msgbody на msgbody. Затем щелкните правой кнопкой мыши карту в обозревателе решений и выберите Проверить карту. Это создаст файл XSLT. Скопируйте этот XSLT-файл в каталог проекта для карты и добавьте его в качестве существующего элемента в проект. Нажмите на сетку вашей карты и задайте пользовательский путь XSLT для вашего XSLT.
Из вашего примера XML-файла в этом вопросе ваш XSLT будет выглядеть
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/NewTable" />
</xsl:template>
<xsl:template match="/NewTable">
<NewTable>
<msgbody>
<xsl:value-of select="msgbody/text()" />
</msgbody>
</NewTable>
</xsl:template>
</xsl:stylesheet>
Но так как вам нужно только значение тела, вам нужно отредактировать XSLT, чтобы удалить <NewTable>
,<msbody>
,</msgbody>
& </NewTable>
и любые другие выходные узлы, которые вы не хотите.
И, наконец, если вы избежали XML в соответствии с вашим предыдущим вопросом, вы захотите добавить disable-output-escaping="yes"
для выбора, как показано ниже, и в соответствии с Как Как убрать символы XML с помощью XSLT?
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/NewTable" />
</xsl:template>
<xsl:template match="/NewTable">
<xsl:value-of select="msgbody/text()" disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>
Примечание. При тестировании карты в Visual Studio вам придется отключить проверку выходных данных, поскольку, конечно, она не соответствует схеме. Однако вы можете создать схему для этого XML.