1

属性値に基づいて、単一タイプのノードに対して特定のXSD検証を行う必要があります。XSD1.1とxsd:alternativeは私の友達です。

しかし、次の(最も単純な)例を使用します。

<xsd:complexType name="BaseType">
    <xsd:attribute name="type" 
                   type="xsd:string" 
                   use="required" />
</xsd:complexType>  

<xsd:complexType name="NamedType">
    <xsd:complexContent>
        <xsd:extension base="BaseType">
            <xsd:attribute name="path" 
                           type="xsd:string" 
                           use="required" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>  

<xsd:complexType name="TaggedType">
    <xsd:complexContent>
        <xsd:extension base="BaseType">
            <xsd:attribute name="tag" 
                           type="xsd:string" 
                           use="required" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>  

<xsd:element name="MyRoot">
    <xsd:complexType>
          <xsd:choice minOccurs="1">
            <xsd:element name="MyType" 
                         type="BaseType">
              <xsd:alternative test="@type='Named'" 
                               type="NamedType"/>
              <xsd:alternative test="@type='Tagged'" 
                               type="TaggedType"/>
            </xsd:element>
          </xsd:choice>
    </xsd:complexType>
</xsd:element>

XSDをロードしているとき(Qt 4.7.4のQXmlSchemaクラスを使用していますが、これはQtの問題ではなくXSDの問題だと思います)、次のエラーが発生します。

不明な場所のエラーXSDError、行93、列74:代替要素のテスト属性に無効なコンテンツが含まれています:{@ type='Named'}。

私はまた、代替のテスト条件で「@type eq'Named'」を試しましたが、他の多くの賢明なバリエーションとあまり賢明でないバリエーション...合格しませんでした:/

どんな助けでも大歓迎です!ありがとう!

4

2 に答える 2

1

Petru Gardeaのように、XSDスキーマは問題ないと思います(さらに言えば、Saxonも問題ありません)。

問題は、XSDプロセッサがXSD1.1をサポートしていないことです。QXmlSchemaクラスリファレンスには、「このクラスは、 XMLSchema1.0仕様に準拠するスキーマを表すために使用されます」と記載されています。エラーメッセージはおそらく少し明確になる可能性があります(xsd:alternativeではなく@typeについて文句を言うことで、実際には間違った考えを示します)が、エラーメッセージにはよく当てはまります。エラーメッセージは、通常、ソフトウェアが処理する準備ができていない状況を報告します。

于 2013-02-14T20:05:24.177 に答える
1

あなたのXSDは私には問題ないようです。QTAssistant(最終的にはXSD 1.1のXercesバージョンに基づいています)で試してみましたが、問題なく動作します。

このサンプルXMLの場合:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <MyType type="Tagged"/> 
</MyRoot>

私は得る:

Error while loading [], line 4 position 25
cvc-complex-type.4: Attribute 'tag' must appear on element 'MyType'.
Document1.xml is XSD 1.1 invalid.

このXMLの場合:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <MyType type="Named"/>  
</MyRoot>

私は得る:

Error while loading [], line 4 position 24
cvc-complex-type.4: Attribute 'path' must appear on element 'MyType'.
Document1.xml is XSD 1.1 invalid.

上記を提案どおりに修正すると、有効なXML結果が得られます。あなたの構文は正しいので、私はあなたのXSDプロセッサのせいにすることしかできません。

于 2013-02-14T18:25:50.187 に答える