使用来自单个 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.
创建一个模式
我收到一个 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.
创建一个模式