2012-05-10 13 views
1

こんにちは私は、別のスキーマを拡張してXML構造を検証するスキーマを開発する方法を見つけようとしています。xs:any wrapper xml schema validation

Source.xsd

<xs:complexType name="AType"> 
    <xs:complexContent> 
    <xs:sequence> 
     <xs:element name="B"/> 
     <xs:any/> 
    </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="A" type="AType"/> 

私は別のスキーマことはできます たちはスキーマAがあり、我々はこのようなスキーマを持つように、それは<xs:any>要素 を使用して拡張ポイントが含まれているとしましょう元のスキーマへの参照でこのXMLを検証しますか?

Extended.xml

<A> 
    <B></B> 
    <C></C> 
</A> 

私は私がC要素を組み込むことAType全体を書き換えることなく、全体A(とC)要素を検証するスキーマを作成したいと思います。また、redefine要素を使用することもできません。

ありがとうございます!

答えて

0

まず、xs:anyには、strict、lax、またはskipの値を持つprocessContents属性があります。厳密とは、コンテンツを検証し、コンテンツのスキーマ定義が見つからない場合、それを無効として扱うことを意味します。 Laxは、 "コンテンツのスキーマ定義を見つけて、それを使って要素を検証する"ことを意味します。スキップ手段は検証しません。

時にはこれで十分です。

さらに制御したい場合は、アプリケーションの制御下でドキュメントの一部を個別に検証することができます。たとえば、スキーマ対応のXSLTまたはXQueryを使用して、これを簡単に実行できます。たとえば、XSLTでは、検証する要素に移動し、xsl:copy-of select = "x" validation = "strict"を使用して、その要素をルートとするサブツリーを検証できます。

+0

ありがとうございました!それを掘り下げるだけで、「任意の」構成物についてより多くのものを取り除くことができます。私が理解していることから、検証されるのは別のスキーマの '新しい'追加要素/コンテンツです。別のスキーマで '大きな'構造全体を検証することは可能でしょうか? – user1330885

+0

私はその質問を理解しているかどうかはわかりません。要素を検証すると、その要素をルートとするサブツリーの妥当性を検証することを意味します。 –

1

私の意見では、現在の1.0仕様(Michael'sはXSLT 2.0以降が必要です)を使用する最良の方法は、xs:anyワイルドカードの代わりに置換グループの先頭を使用することです。バージョン1.0では、ソフトウェアスタックの可用性に対する幅広い相互運用性が実現します。

代替グループを持つxs:anyとは異なり、ベースタイプでアンカーする必要があります。私はそれを複雑なタイプにすることをお勧めします。これは空のcomplexType定義であるため、余分な手荷物を持ちません。

妥当性検査では、パーサーを、ベースグループではなく置換グループのメンバーを含むスキーマにポイントするだけです。

更新:説明するサンプルXSDを追加します。 SubstitutionGroupExample.xsdのように更新君:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="AType"> 
     <xs:sequence> 
      <xs:element name="B"/> 
      <xs:element ref="any" /> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="A" type="AType"/> 
    <xs:complexType name="TAny" abstract="true"/> 
    <xs:element name="any" type="TAny" abstract="true"/> 
</xs:schema> 

Extended.xsd:拡張に基づいて

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd/1" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd/1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:base="http://tempuri.org/XMLSchema.xsd"> 
    <xs:import namespace="http://tempuri.org/XMLSchema.xsd" schemaLocation="SubstitutionGroupExample.xsd"/> 
    <xs:element name="someAny" substitutionGroup="base:any"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="base:TAny"> 
        <xs:sequence> 
         <xs:element name="new"/> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

有効なXML(。XSD):私はペトルはを示唆していると思う何

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:ext="http://tempuri.org/XMLSchema.xsd/1"> 
    <B>anyType</B> 
    <ext:someAny> 
     <ext:new/> 
    </ext:someAny> 
</A> 
1

- と私たちが実際に使用して何かが - これです:あなたは

を定義Base.xsd

<xs:complexType name="AType"> 
    <xs:complexContent> 
    <xs:sequence> 
     <xs:element name="B" type="BType"/> 
     <xs:group ref="ATypeExtra"/> 
    </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="A" type="AType"/> 

Simple.xsd

<xs:include schemaLocation="Base.xsd"/> 

<xs:group name="ATypeExtra"> 
    <xs:sequence> 
    </xs:sequence> 
</xs:group> 

Extended.xsdその後、

<xs:include schemaLocation="Base.xsd"/> 

<xs:group name="ATypeExtra"> 
    <xs:sequence> 
    <xs:element name="C" type="CType"/> 
    </xs:sequence> 
</xs:group> 

とその定義、必要に応じて、検証のためSimple.xsdまたはExtended.xsdのいずれかを使用します。我々の場合には

我々は変化してはならないコアスキーマを使用してシステムを持っていますが、別のインストールで拡張することができるので、我々はすべてのxxxExtraグループ(および属性グループ)と、上記Base.xsdと同等のものを配布リファレンスそれらは、各インストールで異なる方法で定義されます。

+0

こんにちは、私は、私がsubstitutionGroupsで何を意味していたかの例を含めるために投稿を更新しました。あなたが加えたものは正しいものです。外部XSDへの参照は、schemaLocationによって明示的にコード化されず、スキーマローダによって文脈的に解決されるという点で、「ダングリング」と呼ばれるパターンもあります。 –

+0

ああありがとう - 私はあなたの答えを誤解しました。 – MiMo

+0

私はダングリングタイプが好きです。これは、可変コンテンツを作成するためのベストプラクティスです!私が目指しているのは、私がbase/source.xsdに触れないということです。あなたのご意見ありがとうございます! – user1330885