这是一个场景。我正在使用BizTalk实现企业服务总线的过程中,我有一个模式,我正在使用它作为通过BizTalk的消息的处理头。头模式被导入到所有规范模式中。流程标头元素被提升并用于路由。这种方法工作得很好。但是现在我想将这个原始的process header模式扩展到某些消息类型。我想我应该使用xs:redefine来修改主流程头部并添加额外的元素。但是,当我将重新定义的模式导入到规范模式中时,新的process header元素采用规范模式的名称空间,而不是它扩展的process header模式的名称空间。这里有一些正在发生的简化示例: 1. OriginalProcessSchema.xsd
<?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 -重新定义第一个
<?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 -这将导入第二个模式。
<?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中生成第二个文件的实例,则所有元素都在相同的命名空间中:
<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>但是,如果我生成第三个文件的实例,则如下所示:
<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
发布于 2017-11-30 00:24:15
我会这样回答这个问题。你甚至不尝试这样做,就可以解决这个问题。
这意味着,试图创建一个“可扩展”的模式框架比它的价值更麻烦。cXml、ebXml等都是这样做的,而且它们都很疯狂,很难使用。
这种不必要且昂贵的复杂性是JSON取得成功的一个重要原因。
我只会考虑使用一个包含xs:作为头,使用空命名空间。
我在这里用BizTalk写了这篇文章:BizTalk: Simplify BizTalk Dev by Using the Empty Namespace
https://stackoverflow.com/questions/47458204
复制相似问题