代码之家  ›  专栏  ›  技术社区  ›  Leth

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

  •  0
  • Leth  · 技术社区  · 6 年前

    <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中的信封架构是否可能出现这种情况?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dijkgraaf José Ignacio Gutiérrez Guzmán    6 年前

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

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

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

    <NewTable> , <msbody> , </msgbody> </NewTable> 以及您不需要的任何其他输出节点。

    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>
    

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