3

私は2つのxmlスキーマを持っています:
1)infrastructureRoot.xsd:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:mif="urn:hl7-org:v3/mif" 
  xmlns:v3="urn:hl7-org:v3" 
  xmlns:ex="urn:hl7-org/v3-example" 
  xmlns="urn:hl7-org:v3" 
  targetNamespace="urn:hl7-org:v3" 
  elementFormDefault="unqualified">
  <xs:include schemaLocation="datatypes-base.xsd"/>
  <xs:group name="InfrastructureRootElements">
    <xs:sequence>
      <xs:element name="realmCode" 
                  type="Norwegian_customer" 
                  minOccurs="0" 
                  maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:group>
  <xs:attributeGroup name="InfrastructureRootAttributes"/>
</xs:schema>

2)datatypes-base.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:sch="http://www.ascc.net/xml/schematron"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  elementFormDefault="unqualified">
  <xs:complexType name="customer">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Norwegian_customer">
    <xs:complexContent>
     <xs:restriction base="customer">
       <xs:sequence>
         <xs:element name="firstname" type="xs:string"/>
         <xs:element name="lastname" type="xs:string"/>
         <xs:element name="country" 
           type="xs:string" 
           fixed="Norway"/>
     </xs:sequence>
   </xs:restriction>
  </xs:complexContent>
 </xs:complexType>
</xs:schema>

次のC#コードを使用して、すべてのインクルードを含むルートスキーマをロードします。

Func<XmlReader> xmlReaderFactory = () =>
                                        {
                                            XmlReaderSettings schemaReaderSettings = new XmlReaderSettings{ DtdProcessing = DtdProcessing.Parse};
                                                XmlTextReader reader = new XmlTextReader(@"InfrastructureRoot.xsd");
                                            return XmlReader.Create(reader, schemaReaderSettings);
                                        };

XmlSchema xsd = XmlSchema.Read(xmlReaderFactory(), (sender, eventArgs) => {});
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.ValidationEventHandler += (sender, eventArgs) => Console.WriteLine(eventArgs.Message + " " + eventArgs.Severity);

try
{
    try
    {
        XmlReaderSettings schemaReaderSettings = new XmlReaderSettings {DtdProcessing = DtdProcessing.Parse};
        XmlReader schemaReader = XmlReader.Create(new DummyReader(), schemaReaderSettings);
        schemaSet.Add(null, schemaReader);
    }
    catch
    {
        // the only thing this code is needed is to set ProhibitDTD to false
        // there is no acceptable public way to do that
    }

    schemaSet.Add(xsd);
    schemaSet.Compile();
    XmlSchemaInclude external = ((XmlSchemaInclude)xsd.Includes[0]);
    String targetNamespace = external.Schema.TargetNamespace;
    Debug.Assert(targetNamespace == null);
}
catch{}

実行後、「targetNamespace」の値は「urn:hl7-org:v3」に等しくなります。これは、元のスキーマ「datatypes-base.xsd」とは異なり、検証が中断されます。誰かが解決策を手伝ってくれますか?

4

3 に答える 3

2

私たちは、BizTalk と .Net で HL7v3 と CDA を使用してきました。検証とメッセージの送信だけのために CDA スキーマを正しく機能させるにはurn:hl7-org:v3、すべての「coreschemas」xsd ファイルに targetnamespace を追加する必要がありました。その後、検証が機能し、BizTalk メッセージが流れました。

私が実際に所有していないスキーマに targetnamespace を追加するのは気が進まなかったのですが、実際にスキーマ自体を変更したことはなく、その後はうまくいったので、これはまともな妥協案でした。

于 2013-02-06T00:19:53.993 に答える
2

明示的なターゲット名前空間 (infrastructureRoot.xsd など) を持つスキーマ ドキュメントが xs:include を使用して、ターゲット名前空間を指定しないスキーマ ドキュメント (datatypes-base.xsd など) を含める場合、2 番目のスキーマ ドキュメントの宣言は次のように解釈されます。ただし、それらを含むスキーマ ドキュメントは、含むスキーマ ドキュメントと同じ名前空間を持っていました。このメカニズムは、カメレオン インクルード ( chameleon include ) と呼ばれることもあります。インクルードされたスキーマ ドキュメント内の宣言は、コンテキストに応じて、このターゲット名前空間またはそのターゲット名前空間を使用します。

複雑なタイプの Customer と NorwegianCustomerが名前空間 urn:hl7-org:v3 によって取り込まれないようにする場合、infrastructureRoot.xsd は xs:include ではなく xs:import を使用する必要があり、デフォルトの名前空間を変更して、への参照 (現在のように) ではなく、type="Norwegian_customer"への参照{}Norwegian_customer(つまり、ローカル名として名前空間を持たない修飾名) になるようにします。 Norwegian_customer{urn:hl7-org:v3}Norwegian_customer

xs:import コンストラクトは別の名前空間からコンポーネントをインポートしますが、xs:include は同じ名前空間からコンポーネントを含めます。Chameleon インクルードは、インクルードされたスキーマ ドキュメント内のコンポーネントを同じ名前空間に配置する方法と見なすことができます。存在しない場合、インフラストラクチャ スキーマの xs:include は単にエラーを発生させます。

于 2013-02-05T23:58:21.723 に答える
0

元の問題は、HL7v3 ソースをカスタム データ ストレージ形式にインポートする際、および xml スキーマに逆方向にエクスポートする際に見つかりました。2 番目のスキーマはターゲット名前空間を取得しますが、デフォルトの名前空間を取得しないため、検証エラーが発生します。2 番目のスキーマ エクスポート結果は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
 xmlns:sch="http://www.ascc.net/xml/schematron"
 xmlns="urn:hl7-org123:v3" 
 xmlns:v3="urn:hl7-org:v3"
 elementFormDefault="unqualified"
 targetNamespace="urn:hl7-org:v3"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="customer">
 <xs:sequence>
   <xs:element name="firstname" type="xs:string" />
   <xs:element name="lastname" type="xs:string" />
   <xs:element name="country" type="xs:string" />
 </xs:sequence>
</xs:complexType>
 <xs:complexType name="Norwegian_customer">
<xs:complexContent mixed="false">
  <xs:restriction base="customer">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="lastname" type="xs:string" />
      <xs:element fixed="Norway" name="country" type="xs:string" />
    </xs:sequence>
   </xs:restriction>
</xs:complexContent>
 </xs:complexType>
</xs:schema>

規制ベース属性値の検証が失敗します。ターゲット スキーマ設計の説明によると、2 つの可能な解決策があります。

  1. 「v3」プレフィックスを持つ修飾された値を使用します。
  2. デフォルトの名前空間「xmlns="urn:hl7-org:v3」を追加。
于 2013-02-06T18:09:23.020 に答える