4

これが XML/XSD で可能かどうかはわかりませんが、検索してもうまくいきませんでした。

XML を記述しているときに、別の XML 要素に含まれる値の 1 つを参照する必要がある要素を持つことができるように、XSD を指定できますか?

たとえば、次の XML があるとします。

<car>Audi</car>
<car>Ford</car>
<car>Honda</car>

<person>
  <drives>Audi</drives>
</person>

車に入力された値の 1 つでなければならないように、ドライブの XSD をどのように指定しますか?

4

3 に答える 3

6

XSD 1.0 で動作します。理想的には、同じスキーマ タイプと参照整合性の組み合わせを使用する必要があります。

XSD:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="sample">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="car" type="car"/>
                <xsd:element name="person">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="drives" type="car"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PKCars">
            <xsd:selector xpath="car"/>
            <xsd:field xpath="."/>
        </xsd:key>
        <xsd:keyref name="FKPersonCar" refer="PKCars">
            <xsd:selector xpath="person/drives"/>
            <xsd:field xpath="."/>
        </xsd:keyref>
    </xsd:element>
    <xsd:simpleType name="car">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Audi"/>
            <xsd:enumeration value="Ford"/>
            <xsd:enumeration value="Honda"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

図:

ここに画像の説明を入力

無効な XML:

<sample>
    <car>Audi</car>
    <car>Ford</car>
    <car>Honda</car>

    <person>
        <drives>Aud</drives>
    </person>
</sample>

エラー:

Error occurred while loading [], line 7 position 16
The 'drives' element is invalid - The value 'Aud' is invalid according to its datatype 'car' - The Enumeration constraint failed.
specify-xsd-such-that-an-xml-element-must-have-the-value-of-another-xml-element.xml is invalid.

このエラーは、列挙値を使用すると key/keyref が不要になることを示しています。これをトリガーすることはできません。

ただし、XSD に列挙値のリストを含めることができない場合は、空の値が大混乱を引き起こすのを避けるために、少なくとも型の最小の長さを強制する必要があります。もちろん、タイプを共有することをお勧めしますが、共有する必要はありません。

変更された XSD:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="sample">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="car" type="car"/>
                <xsd:element name="person">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="drives" type="car"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PKCars">
            <xsd:selector xpath="car"/>
            <xsd:field xpath="."/>
        </xsd:key>
        <xsd:keyref name="FKPersonCar" refer="PKCars">
            <xsd:selector xpath="person/drives"/>
            <xsd:field xpath="."/>
        </xsd:keyref>
    </xsd:element>
    <xsd:simpleType name="car">
        <xsd:restriction base="xsd:normalizedString">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

エラーメッセージ:

Error occurred while loading [], line 9 position 4
The key sequence 'Aud' in Keyref fails to refer to some key.
specify-xsd-such-that-an-xml-element-must-have-the-value-of-another-xml-element.xml is invalid.
于 2012-11-09T01:49:53.907 に答える
5

XSD 1.1では、アサーションを使用できます。

アサーションコンポーネントは、関連する要素と属性の存在と値を制約します。

XPath 2.0式を使用して、アサーションで検証/テストを実行できます。

このサンプルスキーマには、値がその要素の1つと等しい/docことを保証する要素のアサーションがあります。/doc/person/drives/doc/car

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1" elementFormDefault="qualified">

    <xs:element name="car" type="xs:string" />  
    <xs:element name="drives" type="xs:string" />

    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="drives"/>
            </xs:sequence>     
        </xs:complexType>
    </xs:element>

    <xs:element name="doc">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="car" maxOccurs="unbounded"/> 
                <xs:element ref="person"/>
            </xs:sequence> 
            <xs:assert test="person/drives = car"/>
        </xs:complexType>
    </xs:element>

</xs:schema>
于 2012-11-09T01:18:33.430 に答える
1

これは列挙のように見え、あなたの例はw3schoolsの例と非常によく似ています。

<xs:element name="car" type="carType"/>

<xs:simpleType name="carType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Audi"/>
        <xs:enumeration value="Golf"/>
        <xs:enumeration value="BMW"/>
    </xs:restriction>
</xs:simpleType>

<xs:element name="person">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="drives" type="carType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

そうでない場合は、おそらくPangeasの回答が必要です。

于 2012-11-09T00:38:13.277 に答える