2017-11-23 11 views
0

ここにシナリオがあります。私はBizTalkを使用してESBを実装する過程にありますが、BizTalkを経由するメッセージのプロセスヘッダーとして使用しているスキーマがあります。ヘッダースキーマは、すべての標準スキーマにインポートされます。プロセスヘッダー要素は、ルーティングのために昇格され、使用されます。このアプローチはうまくいきます。しかし、今私は、特定のメッセージタイプに対してこのオリジナルのプロセスヘッダースキーマを広げたいと思っています。私はxs:redefineを使ってメインのプロセスヘッダを変更し、追加の要素を追加すると考えました。しかし、標準スキーマに再定義されたスキーマをインポートするとき、新しいプロセスヘッダー要素は、拡張するプロセスヘッダースキーマの名前空間ではなく、標準スキーマの名前空間を使用します。ここ が起こっていることのいくつかの簡略化した例である: - 最初のスキーマ内の拡張要素(xs:redefineを使用)は、3番目のスキーマにインポートすると間違った名前空間を持ちます

<?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を再定義する1 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 - これにより、2番目のスキーマがインポートされます。私はすべてがよさそうだVisual Studioで二番目のファイルのインスタンスを生成する場合

<?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> 

、全ての要素が同じ名前空間にあります。しかし

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

私は3番目のファイルのインスタンスを生成する場合、この

Field3は、製品標準(この例ではProductNamespace)の名前空間にあります。私はそれがProcessHeader名前空間にあることを期待しています。同僚はこれを別のツール(oXygen xml)で見てきましたが、実際にはプロセスヘッダー内のすべての要素の名前空間は同じです。これはVisual Studio/Biztalkのバグですか?誰かがここで何が起こっているかについての光を放つことができますか、これを修正しますか?

私は質問をこのようにお答えしますのVisual Studio 2013およびBizTalk Serverの2013

+0

あなたはこれらのスキーマを自分で作成していますか?それとも実装しようとしている標準ですか?この質問に基づいて、あなたの実装を複雑にする上で*大きなリスクがあるからです。 –

+0

はい、私たちはスキーマを作成しています。それは実装しようとしている標準です。アイデアは、すべてのメッセージ用の一般的なプロセスヘッダーがあり、必要に応じてそれを拡張する方法があるということです。 –

+0

どのような基準を聞くことができますか?私はそれらの多くを見た。 –

答えて

0

を使用しています。あなたはこれをやろうとしても、この問題を解決します。

意味、「拡張可能な」スキーマフレームワークを作成しようとすると、それは価値があります。 cXml、ebXmlなどはすべてこれを行い、は愚かであり、愚かにはで作業するのは難しいです。

この不要で高価な複雑さは、JSONがそれをやり遂げた理由(IMO)です。 1つのXSを使用して

は:ヘッダのはすべて私も空の名前空間を使用して、検討するされています。

私はここでのBizTalkでこれについて書きました:BizTalk: Simplify BizTalk Dev by Using the Empty Namespace

関連する問題