属性ref属性

时间:2013-08-19 08:07:15

标签: xml xsd

我想为一个属性引用一个属性,所以我可以限制用户不要忘记写另一个标签中没有相同属性的属性
例如:
无效:(因为没有名为word的标记具有属性B

<model name="A"/>
<model name="B"/>
<word key="A">
    <value lange="english">Add</value>
    <value lange="frensh">ajouter</value>
</word>

有效的:

<model name="A"/>
<model name="B"/>
<word key="A">
    <value lange="english">Add</value>
    <value lange="frensh">ajouter</value>
</word>
<word key="B">
    <value lange="english">Add</value>
    <value lange="frensh">ajouter</value>
</word>

可以在xsd中完成吗?

2 个答案:

答案 0 :(得分:0)

可以通过将model/@name声明为ID,将word/@key声明为IDREF来实现此特定用例。

但是,ID必须在整个文档中是唯一的,而不是依赖于元素名称或层次结构中的位置来消除歧义。如果您有任何其他使用“A”或“B”作为ID的元素,那么您的文档将无效。

使用RelaxNG可以实现不同类型的条件验证,而不是XSD,因此您可以考虑使用它。

答案 1 :(得分:0)

我很害怕你无法使用XSD 1.0实现这一目标。您只能限制key元素<word>属性的值,才能在name元素的<model>属性中显示某些值,如下图所示。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="root_type">
        <xs:sequence>
            <xs:element name="model" type="model_type" maxOccurs="unbounded">
                <xs:key name="name_key">
                    <xs:selector xpath="."/>
                    <xs:field xpath="@name"/>
                </xs:key>
            </xs:element>
            <xs:element name="word" type="word_type" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="model_type">
        <xs:attribute name="name"/>
    </xs:complexType>
    <xs:complexType name="word_type">
        <xs:sequence>
            <xs:element name="value"/>
        </xs:sequence>
        <xs:attribute name="key"/>
    </xs:complexType>
    <xs:element name="root" type="root_type">
        <xs:keyref name="name_keyref" refer="name_key">
            <xs:selector xpath="word"/>
            <xs:field xpath="@key"/>
        </xs:keyref>
    </xs:element>
</xs:schema>

但是无法强制name属性覆盖所有name属性。在这种情况下,我会改变结构,因为如果你有这样的需要,它会发出信号<word>元素应该包含在<model>元素中。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="root_type">
        <xs:sequence>
            <xs:element name="model" type="model_type" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="model_type">
        <xs:sequence>
            <xs:element name="word" type="word_type" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="name"/>
    </xs:complexType>
    <xs:complexType name="word_type">
        <xs:sequence>
            <xs:element name="value"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="root" type="root_type"/>
</xs:schema>