Xsd 使用XML架构指定XML实例中的默认命名空间

Xsd 使用XML架构指定XML实例中的默认命名空间,xsd,biztalk,xml-namespaces,biztalk-2009,Xsd,Biztalk,Xml Namespaces,Biztalk 2009,我不确定这是否重要,但我正在使用BizTalk 2009生成XML 有没有办法在我的XML模式中指定生成的XML实例应该使用目标命名空间作为默认命名空间 如果我有这样一个xsd文件: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/"> <xs:element name="example"> <xs:

我不确定这是否重要,但我正在使用BizTalk 2009生成XML

有没有办法在我的XML模式中指定生成的XML实例应该使用目标命名空间作为默认命名空间

如果我有这样一个xsd文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/">
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute name="value" type="xs:string" /> 
    </xs:complexType>
  </xs:element>
</xs:schema>
<ns0:example value="something" xmlns:ns0="http://example.com/" />
<example value="something" xmlns="http://example.com/" />

它创建一个如下所示的XML文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/">
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute name="value" type="xs:string" /> 
    </xs:complexType>
  </xs:element>
</xs:schema>
<ns0:example value="something" xmlns:ns0="http://example.com/" />
<example value="something" xmlns="http://example.com/" />

但我希望它创建如下XML文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/">
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute name="value" type="xs:string" /> 
    </xs:complexType>
  </xs:element>
</xs:schema>
<ns0:example value="something" xmlns:ns0="http://example.com/" />
<example value="something" xmlns="http://example.com/" />


我知道它们在技术上是等价的,但消费者(供应商API)的实现很差,我希望能满足他们的期望。

我希望这取决于生成实例的软件,而不是模式。XSD模式的开发是为了根据模式验证XML实例,而不是从模式生成实例。因此,它不太可能在XMLSchema中显式出现。但是,生成工具可能会使用元素(未)限定的事实

触发前缀


不完全在范围内,但以下内容对于模式设计是值得一读的:

一种方法是定义一个没有名称空间的模式。将BizTalk架构映射到新定义的没有命名空间的架构。从BizTalk的角度来看,您将拥有一个表示与使用者的实际契约的模式。(即没有名称空间)此外,BizTalk使用名称空间#rootnodename来定义消息类型。在本例中,您将有两个模式

  • somenamespace#somerootnodename
  • #somerootnodename

  • 这种方法可能存在的缺点是,这会将此模式(#rootnodename)的使用限制为BizTalk组的一个实例。

    这是BizTalk处理此XML模式的默认行为,据我所知,没有内置的方法来更改

    然而,您真正想要的是出站消息符合比BizTalk使用的更干净、更自由的格式。您可以通过使用自定义管道组件(和自定义发送管道)在传出消息离开BizTalk之前对其进行处理来实现这一点

    其思想是在BizTalk外部发送消息时更改名称空间前缀。转换发生在发送管道的处理过程中

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

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


    只要BizTalk btm映射消息,就会添加
    ns0
    前缀。这并不重要,因为这仍然是有效的xml,但是,当使用遗留的或不完整的xml解析器向合作伙伴发送消息时,这可能是一个问题

    您可以删除
    ns0
    前缀,通过将btm从一个列表中更改,将
    ns0
    设置为输出消息上的默认名称空间

    e、 g.将映射转换为xslt后,将xslt更改为:

    <?xml version="1.0" encoding="utf-16"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                    exclude-result-prefixes="msxsl s0"
                    version="1.0"
                    xmlns:ns0="http://targetns"
                    xmlns:s0="http://sourcens"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
      <xsl:template match="/">
        <xsl:apply-templates select="s0:FromRoot" />
      </xsl:template>
      <xsl:template match="s0:FromRoot">
        <ns0:ToRoot>
          <xsl:for-each select="s0:FromElement">
            <ns0:ToElement>
              <xsl:value-of select="text()"/>
            </ns0:ToElement>
          </xsl:for-each>
        </ns0:ToRoot>
      </xsl:template>
    </xsl:stylesheet>
    
    
    
    致:

    
    
    i、 e.更改默认xmlns,然后自动删除ns0前缀


    也可以使用更通用的解决方案(例如,类似于Firras),这可能非常有用,例如,将其放置为发送端口映射,以从元素中去除所有前缀。但是,如果输出消息上有多个XMLN,则需要小心

    如果您需要帮助设置这样的自定义管道组件,请告诉我。