使用来自单个 XML 节点的内容作为 XML 文档,同时提升同一级别的 XML 节点

Using content from a single XML node as the XML document, while promoting the XML nodes on the same level

我收到一个 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 节点的子节点。我不需要 msgbody 标记中 XML 的架构,它应该作为直通发送。我需要的是提升其他一些 XML 节点,例如 msgType,以便它们可以用于过滤 Biztalk 中的文档,同时仅发送 msgbody 标记中的内容。

在 Biztalk 中使用 Envelope 架构是否可能实现这种情况?

我认为这与您的问题有关Extracting XML document in XML node from WCF-SQL message using body path expression

您可能需要做的第一件事是从任何节点中删除任何 Min Occurs 或 Max Occurs,以便它们只出现 1 次。 然后,您可以提升要在消息上下文中保留的属性。

下一部分是提取 msgbody 部分,在您之前的问题中,答案是使用 XPath 提取适配器中的正文部分,但是在它通过 XML dissassembler,所以你会想要创建一个地图来为你提取它。

只需创建一个将输入和输出设置为您的模式的映射,创建一个从 msgbody 到 msgbody 的 link。然后右键单击解决方案资源管理器中的地图并单击验证地图。这将生成一个 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" 添加到 select 中,如下所示并按照 How to unescape XML characters with help of 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.

创建一个模式