我认为这与您的问题有关Extracting XML document in XML node from WCF-SQL message using body path expression
您可能需要做的第一件事是从任何节点中删除任何 Min Occurs 或 Max Occurs,以便它们仅出现 1。
然后,您可以提升要在消息上下文中保留的属性。
下一部分是提取 msgbody 部分,在您之前的问题中,答案是使用 XPath 提取适配器中的正文部分,但是在通过 XML 反汇编程序之前您将丢失这些标头,所以而不是您想要创建一个地图来为您提取它。
只需创建一个将输入和输出设置为您的架构的映射,创建从 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" 添加到下面的选择中,并按照 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 创建一个模式。