1

我有以下架构:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://www.RedEyedMonster.co.uk/Integration/ESB" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" elementFormDefault="qualified" targetNamespace="http://www.RedEyedMonster.co.uk/Integration/ESB" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <b:schemaInfo is_envelope="no" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="ExternalEvent">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="XmlType" type="xs:string" />
        <xs:element minOccurs="1" maxOccurs="1" name="EscXml" type="xs:string" />
       </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

其中 EscXml 包含可能非常复杂的转义 XML。是否可以在映射(即 unescape)中将其转换为节点或从 XmlType 派生的模式?

4

2 回答 2

2

应用此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*[local-name()='EscXml']">
    <xsl:copy>
        <xsl:value-of select="." disable-output-escaping="yes"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

对于此示例文档:

<ExternalEvent xmlns="http://www.RedEyedMonster.co.uk/Integration/ESB">
<XmlType>Testing1Two6</XmlType>
<EscXml>&lt;!--  Edited by XMLSpy&#174;  --&gt;
&lt;note&gt;
&lt;to&gt;Tove&lt;/to&gt;
&lt;from&gt;Jani&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;Don&apos;t forget me this weekend!&lt;/body&gt;
&lt;/note&gt;</EscXml>
</ExternalEvent>

给我以下结果——也在 BizTalk 中:

<?xml version="1.0" encoding="UTF-8"?>
<ExternalEvent xmlns="http://www.RedEyedMonster.co.uk/Integration/ESB">
   <XmlType>Testing1Two6</XmlType>
   <EscXml>

      <!--  Edited by XMLSpy®  -->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

   </EscXml>
</ExternalEvent>

希望这可以帮助 :]

于 2013-05-24T23:00:29.823 回答
1

我看到有两个通用选项供您操作 EscXML 的内容。

选项1

在地图中,您可以构建 functoid 或使用由自定义程序集支持的脚本 functoid,该程序集将接收 xml 的内容作为参数。然后,该方法必须对提供的 XML 进行转义,您可以使用 XDocument、xpath 语句或类似的东西来根据需要解析和更新内容。然后该方法可以转义 XML 并将其返回给映射器。

这种方式会占用大量内存,而且不是那么灵活,因为您必须在代码中完成所有消息操作。

选项 2

如果您的消息正在通过编排,您可以在那里做一些工作来提取 EscXML 的内容,将其取消转义,然后将其分配给基于 XmlType 的消息变量。从那里,您将能够利用映射器等。一旦您在那里完成,您可以再次将其转义并将其塞回您的包装消息中。

由于您可以在这种情况下进行流式传输,因此您应该减少内存密集型(用于消息创建),并且您还可以使用映射器等。这里最大的警告是您需要一个编排来执行此操作。

于 2013-05-23T21:42:21.253 回答