使用BizTalk映射来转换特定节点中的XML

时间:2013-05-23 15:58:01

标签: xslt biztalk biztalk-2010 biztalk-mapper

我有以下架构:

<?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派生的模式?

2 个答案:

答案 0 :(得分: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>

希望这会有所帮助:]

答案 1 :(得分:1)

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

选项1

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

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

选项2

如果您的消息是通过业务流程传递的,那么您可以在那里进行一些工作来提取EscXML的内容,对其进行转换,然后将其分配给基于XmlType的消息变量。从那里,你将能够利用映射器等。一旦你完成了,你可以再次逃脱它并将其重新填充到你的包装消息中。

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