我有以下架构:
<?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派生的模式?
答案 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><!-- Edited by XMLSpy® -->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note></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的消息变量。从那里,你将能够利用映射器等。一旦你完成了,你可以再次逃脱它并将其重新填充到你的包装消息中。
由于您可以在这种情况下流式传输,因此它应该减少内存密集(用于创建消息),并且您还可以使用映射器等。这里最大的警告是您需要一个业务流程来执行此操作