1

こんにちは、別のスキーマ検証 XML 構造を拡張するスキーマを開発する方法を見つけようとしています。スキーマ A があり、要素を使用する拡張ポイントが含まれていると<xs:any>しましょう。したがって、次のようなスキーマがあります。

ソース.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"/>

元のスキーマを参照してこの XML を検証する別のスキーマを作成できますか?

拡張.xml :

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

要素を組み込むために全体を書き直さなくてもA、( を使用して) 要素全体を検証するスキーマを作成したいと考えています。また、要素を使用することはできません。CATypeCredefine

前もって感謝します!

4

3 に答える 3

1

Petruが示唆していること、そして私たちが実際に使用していることは、これです。

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のいずれかを使用します。

この例では、変更してはならないコアスキーマを備えたシステムがありますが、さまざまなインストールで拡張できるため、上記のBase.xsdに相当するものを、すべてのxxxExtraグループ(および属性グループ)の参照とともに配布します。各インストールの方法。

于 2012-05-10T17:17:00.217 に答える
1

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

時にはこれで十分です。

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

于 2012-05-10T09:02:56.760 に答える
1

私の意見では、現在の 1.0 仕様 (Michael の仕様では 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>

拡張.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 (Extended.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>
于 2012-05-10T11:36:08.247 に答える