在Biztalk中,如何使用额外元素拆分信封?

时间:2012-11-12 21:42:27

标签: biztalk pipeline orchestration

我正在尝试以下列形式拆分传入的消息:

 <Items>
    <BatchID>123</BatchID>
    <Item>...</Item>
    <Item>...</Item>
    <Item>...</Item>
  </Items>

我有一个带有XML反汇编程序的管道,它接受Items模式并输出Item模式。在Items架构上,Envelope属性设置为true,“Body XPath”属性指向Items元素。

然而,当我尝试处理文件时,我收到错误:Finding the document specification by message type "BatchID" failed. Verify the schema deployed properly.,大概是因为它只期望Item元素,并且它不知道如何处理BatchID元素。

如果我将BatchID作为Items元素的一个属性(就像一个明智的人会有),一切正常。不幸的是,我坚持布局。

目前,我并不关心BatchID的价值是什么。

如何让它拆分信息?

1 个答案:

答案 0 :(得分:2)

AFAIK Xml反汇编程序总是提取指定body_xpath元素的所有子节点 - 它可能是一个很好的功能,可以指定项目Xpath :(。

您可以通过以下方式解决此限制:

  • 为不受欢迎的<BatchID>元素创建架构,然后只吃它的实例,例如:使用TomasR的Null Adapter
  • 创建订阅发送端口
  • 或者,在信封被分页之前,在接收端口上的地图中转换信封,转换会删除不需要的Batch元素

以下XSLT应该可以解决这个问题:

<?xml version="1.0" encoding="utf-8"?>
<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" xmlns:ns0="http://BizTalk_Server_Project3.Envelope">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
    <xsl:template match="/">
        <xsl:apply-templates select="/ns0:Items" />
    </xsl:template>
    <xsl:template match="/ns0:Items">
        <ns0:Items>
            <!--i.e. Copy all Item elements and discard the Batch elements-->
            <xsl:copy-of select="ns0:Item"/>
        </ns0:Items>
    </xsl:template>
</xsl:stylesheet>

请参阅here,了解如何将btm从可视化地图转换为xslt