首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式(使用xs:redefine)中的扩展元素在导入到第三个模式时具有错误的命名空间

模式(使用xs:redefine)中的扩展元素在导入到第三个模式时具有错误的命名空间
EN

Stack Overflow用户
提问于 2017-11-23 22:51:05
回答 1查看 334关注 0票数 0

这是一个场景。我正在使用BizTalk实现企业服务总线的过程中,我有一个模式,我正在使用它作为通过BizTalk的消息的处理头。头模式被导入到所有规范模式中。流程标头元素被提升并用于路由。这种方法工作得很好。但是现在我想将这个原始的process header模式扩展到某些消息类型。我想我应该使用xs:redefine来修改主流程头部并添加额外的元素。但是,当我将重新定义的模式导入到规范模式中时,新的process header元素采用规范模式的名称空间,而不是它扩展的process header模式的名称空间。这里有一些正在发生的简化示例: 1. OriginalProcessSchema.xsd

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:mh="http://ProcessHeaderNamespace" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" elementFormDefault="qualified" targetNamespace="http://ProcessHeaderNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MessageHeader" type="mh:ProcessHeader">

  </xs:element>
    <xs:complexType name="ProcessHeader">
      <xs:sequence>
        <xs:element name="Field1" type="xs:string" />
        <xs:element name="Field2" type="xs:string" />
      </xs:sequence>
    </xs:complexType>

</xs:schema>

2.ExtendedProcessHeaderSchema.xsd -重新定义第一个

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:mh="http://ProcessHeaderNamespace" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" elementFormDefault="qualified" targetNamespace="http://ProcessHeaderNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation=".\OriginalProcessSchema.xsd">
    <xs:complexType name="ProcessHeader">
      <xs:complexContent mixed="false">
        <xs:extension base="mh:ProcessHeader">
          <xs:sequence>
            <xs:element name="Field3" type="xs:string" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
</xs:schema>

3.CanonicalSchema.xsd -这将导入第二个模式。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://ProductNamespace" xmlns:ph="http://ProcessHeaderNamespace" targetNamespace="http://ProductNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation=".\ExtendedProcessHeaderSchema.xsd" namespace="http://ProcessHeaderNamespace" />
  <xs:annotation>
    <xs:appinfo>
      <b:references>
        <b:reference targetNamespace="http://ProcessHeaderNamespace" />
      </b:references>
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="Product">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ProcessHeader" type="ph:ProcessHeader" />
        <xs:element name="ProductDate">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Field4" type="xs:string" />
              <xs:element name="Field5" type="xs:string" />
              <xs:element name="Field6" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

如果我在visual studio中生成第二个文件的实例,则所有元素都在相同的命名空间中:

代码语言:javascript
复制
<ns0:MessageHeader xmlns:ns0="http://ProcessHeaderNamespace">
  <ns0:Field1>Field1_0</ns0:Field1>
  <ns0:Field2>Field2_0</ns0:Field2>
  <ns0:Field3>Field3_0</ns0:Field3>
</ns0:MessageHeader>

但是,如果我生成第三个文件的实例,则如下所示:

代码语言:javascript
复制
<ns0:Product xmlns:ns0="http://ProductNamespace">
  <ProcessHeader>
    <ns1:Field1 xmlns:ns1="http://ProcessHeaderNamespace">ph:Field1_0</ns1:Field1>
    <ns1:Field2 xmlns:ns1="http://ProcessHeaderNamespace">ph:Field2_0</ns1:Field2>
    <ns0:Field3>Field3_0</ns0:Field3>
  </ProcessHeader>
  <ProductDate>
    <Field4>Field4_0</Field4>
    <Field5>Field5_0</Field5>
    <Field6>Field6_0</Field6>
  </ProductDate>
</ns0:Product>

Field3位于产品规范的名称空间中(本例中为ProductNamespace)。我希望它在ProcessHeader名称空间中。一位同事用一个不同的工具(oXygen xml)研究了这一点,事实上,process header中所有元素的名称空间都是相同的。那么这是Visual Studio / Biztalk中的一个bug吗?有没有人能说明这里发生了什么,或者提供一个解决方案?

我正在使用Visual Studio 2013和BizTalk Server 2013

EN

回答 1

Stack Overflow用户

发布于 2017-11-30 00:24:15

我会这样回答这个问题。你甚至不尝试这样做,就可以解决这个问题。

这意味着,试图创建一个“可扩展”的模式框架比它的价值更麻烦。cXml、ebXml等都是这样做的,而且它们都很疯狂,很难使用。

这种不必要且昂贵的复杂性是JSON取得成功的一个重要原因。

我只会考虑使用一个包含xs:作为头,使用空命名空间

我在这里用BizTalk写了这篇文章:BizTalk: Simplify BizTalk Dev by Using the Empty Namespace

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47458204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档