web-dev-qa-db-ja.com

XMLスキーマのrefとtypeの違いは何ですか?

次のスキーマを検討してください。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="Root">
        <xs:sequence>
            <xs:element ref="Child" />
            <xs:element name="Child2" type="Child" />
        </xs:sequence>
        <xs:attribute ref="Att" />
        <xs:attribute name="Att2" type="Att" />
    </xs:complexType>

    <xs:complexType name="Child">
        <xs:attribute ref="Att" />
    </xs:complexType>

    <xs:attribute name="Att" type="xs:integer" />

</xs:schema> 

6行目のref to "Child"は失敗しますが、7行目のtypeは検証されます。属性の場合、refは失敗し、typeは失敗します。その理由を理解しようとしています。

refについての私の理解は、それが別の要素を単に参照し、その場所で参照された型のインスタンスが(定義で指定された名前で)表示されることを期待することを指定したということでした。明らかに私は間違っているので、refは実際にはどういう意味ですか?

18
Nigel Hawkins

Ref = ".."を使用すると、他の場所で定義された既存の要素/属性を「貼り付け」ます。 type = ".."を使用して、いくつかの構造(complextype/simpletypeで定義)を新しい要素/属性に割り当てます。以下を見てください:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test">

    <xs:complexType name="Root">
        <xs:sequence>
            <xs:element ref="tst:Child" />
            <xs:element name="Child2" type="tst:ChildType" />
        </xs:sequence>
        <xs:attribute ref="tst:AttRef" />
        <xs:attribute name="Att2" type="tst:AttType" />
    </xs:complexType>

    <xs:complexType name="ChildType">
        <xs:attribute ref="tst:AttRef" />
    </xs:complexType>

    <xs:element name="Child">
    </xs:element>

    <xs:simpleType name="AttType">
        <xs:restriction base="xs:string">
            <xs:maxLength value="10" />
        </xs:restriction>
    </xs:simpleType>

    <xs:attribute name="AttRef" type="xs:integer" />

</xs:schema> 
20
Jirka Š.

コンテンツモデル内では、xs:element要素は次のいずれかです。

  1. 要素宣言(要素の名前とタイプを与える)または
  2. トップレベルの要素宣言への参照(要素を識別する方法として要素の名前を指定し、型の実際の宣言に従う)。

(同じ名前/参照の代替が属性宣言と属性参照に適用され、インライン型定義と名前付き型への参照の間にも同様の二分があります。)

この例では、Childという名前の要素の最上位の宣言がないため、ref属性は失敗します。これがお役に立てば幸いです。

Refとtypeの重要な違いは、typeではレベルを下に移動できないことですが、refでは、追加のレベルを持つことができる要素などを使用できます。

1
Buckeye