Xsd 我需要BizTalk映射停止将xml:lang转换为ns1:lang

Xsd 我需要BizTalk映射停止将xml:lang转换为ns1:lang,xsd,biztalk,biztalk-2009,Xsd,Biztalk,Biztalk 2009,我在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/XMLSche

我在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>
<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
前缀?

据我所知,实现这一点没有内置的方法

但是,我可以看到两种解决方案:

使用自定义XML样式表

<ns0:example xmlns:ns0="http://example.com/"
             xmlns:ns1="http://www.w3.org/XML/1998/namespace"
             ns1:lang="en-US" />
如果您在地图上点击右键并仔细查看生成的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">
...
<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映射程序的默认行为,您无法对此执行任何操作。但是,如果继续提取生成的XSLT并将其用作映射的后端,则可以更改此声明以匹配预期结果

  • 首先,将样式表复制到项目的位置
  • 将此样式表作为文件包含在BizTalk项目中
  • 更新样式表,以便名称空间声明和匹配的属性前缀正确
生成的xsl样式表如下所示:

<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">
...
<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">
...

...
...
现在您可以使用此自定义样式表作为映射的后端

  • 在Visual Studio中,打开地图
  • 在BizTalk designer图面中的空白处单击任意位置
  • 在映射属性中,找到自定义XSL路径并指定自定义样式表的位置

使用自定义管道组件

<ns0:example xmlns:ns0="http://example.com/"
             xmlns:ns1="http://www.w3.org/XML/1998/namespace"
             ns1:lang="en-US" />
您所追求的是邮件是否适合您的目标收件人。因此,我们的想法是在BizTalk外部发送消息时,更改有问题的名称空间前缀。转换发生在发送管道的处理过程中

已经写了博客并提供了一些源代码。您可以使用他的示例作为替换名称空间前缀的基础,而不是替换名称空间本身

我强烈建议您查看他关于开发流媒体管道组件的一系列文章。Nic在描述编写健壮的企业级管道组件所需的一切方面做了广泛而彻底的工作


据我所知,实现这一目标没有内在的方法

但是,我可以看到两种解决方案:

使用自定义XML样式表

<ns0:example xmlns:ns0="http://example.com/"
             xmlns:ns1="http://www.w3.org/XML/1998/namespace"
             ns1:lang="en-US" />
如果您在地图上点击右键并仔细查看生成的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">
...
<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映射程序的默认行为,您无法对此执行任何操作。但是,如果继续提取生成的XSLT并将其用作映射的后端,则可以更改此声明以匹配预期结果

  • 首先,将样式表复制到项目的位置
  • 将此样式表作为文件包含在BizTalk项目中
  • 更新样式表,以便名称空间声明和匹配的属性前缀正确
生成的xsl样式表如下所示:

<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">
...
<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">
...

...
...
现在您可以使用此自定义样式表作为映射的后端

  • 在Visual Studio中,打开地图
  • 在BizTalk designer图面中的空白处单击任意位置
  • 在映射属性中,找到自定义XSL路径并指定自定义样式表的位置

使用自定义管道组件

<ns0:example xmlns:ns0="http://example.com/"
             xmlns:ns1="http://www.w3.org/XML/1998/namespace"
             ns1:lang="en-US" />
您所追求的是邮件是否适合您的目标收件人。因此,我们的想法是在BizTalk外部发送消息时,更改有问题的名称空间前缀。转换发生在发送管道的处理过程中

已经写了博客并提供了一些源代码。您可以使用他的示例作为替换名称空间前缀的基础,而不是替换名称空间本身

我强烈建议您查看他关于开发流媒体管道组件的一系列文章。Nic在描述编写健壮的企业级管道组件所需的一切方面做了广泛而彻底的工作


    • 除了马克西姆的建议,我还发现了其他一些可能性:

      忽略它,希望供应商的API会接受它。

      我认为这行不通。测试映射时,BizTalk会显示以下错误:

      输出验证错误:前缀“ns1”无法映射到为“xml”或“xmlns”保留的命名空间名称。

      你好,BizTalk!?是你决定使用ns1的。别跟我抱怨了

      使用基于XSL的脚本functoid强制输出。

      这是基于。它要求我们伪造输出模式以使用伪属性,该伪属性由functoid替换为xml:lang属性`

      添加搜索/替换表达式


      以调用映射的编排为例,在其后面添加一个表达式,该表达式将获取我们发送给供应商的XML,并通过搜索/替换正则表达式运行它以修复名称空间前缀。

      除了Maxime的建议之外,我还发现了其他可能性:

      忽略它,希望供应商的API会接受它。

      我认为这行不通。当我测试地图时,BizTalk会给我