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

使用单个XML节点的内容作为XML文档,同时在同一级别提升XML节点,xml,schema,biztalk,envelope,Xml,Schema,Biztalk,Envelope,我收到一个XML文档,其中包含一个节点上的另一个XML文档,如下面的结构所示: <NewTable> <conversationID>f5296f48-90b4-4370-8f16-0115a105c161</conversationID> <hostUTC>2018-11-20T16:29:36.04Z</hostUTC> <msgType>INVOIC</msgType> &l

我收到一个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>
我曾考虑过使用信封模式,但在我的例子中,我不能将标记作为NewTable节点的子节点使用。我不需要msgbody标记中XML的模式,它应该作为传递发送。我需要的是升级其他一些XML节点,例如msgType,以便它们可以用来过滤Biztalk中的文档,同时只发送msgbody标记中的内容


使用Biztalk中的信封架构是否可能出现这种情况

我认为这与你的问题有关

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

下一部分是提取msgbody部分,在您前面的问题中,答案是使用XPath在适配器中提取body部分,但是在它通过XML dissasembler之前,您将丢失这些头,因此您需要创建一个映射来提取它

只要创建一个将输入和输出设置为模式的映射,就可以创建一个从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>

注意:在VisualStudio中测试映射时,必须禁用输出验证,因为它当然与模式不匹配。但是,您可以为该XML创建模式。

是的,它们是相关的:非常感谢您的回答。我已经完成了所有步骤,并将架构和映射部署到Biztalk。我尝试通过将接收管道设置为XML receive并指定我的架构并将入站映射设置为我之前创建的映射来进行测试,但执行管道时出错:输入字符串的格式不正确。。当我尝试根据我的模式验证文档时,我没有得到任何错误。这可能是什么原因造成的?它在管道的XML Dissasembler阶段失败了吗?我找到了产生错误的原因。我有一个升级,它将一个字段从字符串转换为int。我现在在入站映射上得到一个不同的错误,即msgbody XML中的名称空间与任何模式都不匹配。我如何告诉它忽略msgbody xml中的名称空间?
<?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>