我在BizTalk 2009中有一张地图,它将一些数据转换为XML文档,然后发送到另一个系统。目标模式包含一些具有xml:lang
属性的元素。 BizTalk生成ns1:lang
。目标系统要求使用前缀xml
。
这是一个简化示例,用于显示BizTalk正在做什么:
sample.xsd
<xs:schema targetNamespace="http://example.com/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="common.xsd"
namespace="http://www.w3.org/XML/1998/namespace" />
<xs:element name="example">
<xs:complexType>
<xs:attribute ref="xml:lang" />
</xs:complexType>
</xs:element>
</xs:schema>
common.xsd
<xs:schema xmlns:xml="http://www.w3.org/XML/1998/namespace"
targetNamespace="http://www.w3.org/XML/1998/namespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attribute name="lang" type="xs:language" />
</xs:schema>
地图输出示例
<ns0:example xmlns:ns0="http://example.com/"
xmlns:ns1="http://www.w3.org/XML/1998/namespace"
ns1:lang="en-US" />
有没有办法说服BizTalk使用xml
前缀?
答案 0 :(得分:4)
据我所知,没有内置的方法来实现这一目标。
然而,我可以看到两种解决方案:
使用自定义XML样式表
如果您右键单击地图并仔细查看生成的xsl样式表,您将看到如下的XML名称空间声明:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://www.w3.org/XML/1998/namespace"
...
>
...
<xsl:attribute name="ns1:lang">
...
这是BizTalk映射器的默认行为,您无法对其执行任何操作。但是,如果您继续提取生成的XSLT并将其用作地图的后端,则可以更改此声明以匹配预期结果。
生成的xsl样式表如下所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
...
>
...
<xsl:attribute name="xml:lang">
...
现在,您可以将此自定义样式表用作地图的后端。
使用自定义管道组件
您所追求的是该邮件对您的目标收件人是正确的。因此,我们的想法是更改有问题的命名空间前缀,作为在BizTalk外部发送消息的一部分。转换发生在发送管道的处理过程中。
Nic Barden已发布博客并提供了一些源代码about this here。您可以使用他的示例作为执行名称空间前缀替换的基础,而不是替换名称空间本身。
我强烈建议您查看他在开发流媒体管道组件方面所做的所有帖子。 Nic已经做了大量而全面的工作,描述了编写健壮的企业级管道组件所需的所有内容。
答案 1 :(得分:1)
更简单的方法是让一切正常工作,就是在模式定义的开头添加名称空间声明,如下所示。
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xml="http://www.w3.org/XML/1998/namespace">
<xs:import schemaLocation="xml.xsd" namespace="http://www.w3.org/XML/1998/namespace" />
答案 2 :(得分:0)
除了Maxime的建议之外,还有我发现的其他可能性:
忽略它,并希望供应商的API能够接受它。
我不认为这会奏效。当我测试地图时,BizTalk给了我这个错误:
Output validation error: Prefix 'ns1' cannot be mapped to namespace name reserved for "xml" or "xmlns".
你好,BizTalk!?你是那个决定使用ns1的人。不要向我抱怨!
使用基于XSL的脚本functoid强制输出。
这基于the suggestion I received on the BizTalk forums。它要求我们捏造输出模式以使用由functoid替换为xml:lang属性的虚拟属性。
添加搜索/替换表达
获取调用映射的业务流程并在其后添加一个表达式,该表达式将采用我们发送给供应商的XML并通过搜索/替换正则表达式来运行它来修复名称空间前缀。