Использование контента из одного узла XML в качестве документа XML, в то же время продвигая узлы XML на одном уровне - PullRequest
0 голосов
/ 22 ноября 2018

Я получаю 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 Ответ

0 голосов
/ 23 ноября 2018

Я полагаю, это связано с вашим вопросом Извлечение XML-документа в узле XML из сообщения WCF-SQL с использованием выражения пути к телу

Первое, что вам, вероятно, нужно сделать, это удалитьлюбой Min Происходит или Макс Происходит от любого из узлов, так что они встречаются только 1. Затем вы можете продвигать свойства, которые вы хотите сохранить в контексте вашего сообщения.

Следующая часть будет извлекать часть msgbody,в вашем предыдущем вопросе ответом было использование XPath для извлечения части тела в адаптере, но тогда вы потеряете эти заголовки до того, как они пройдут через XML disasembler, вместо того, чтобы создавать карту для ее извлечения дляВы вместо этого.

Просто создайте карту, в которой вход и выход настроен на вашу схему, создайте ссылку с 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.

...