1


我想将一个属性引用到一个属性,所以我可以对用户进行限制,他不会忘记在另一个标签示例中编写一个没有相同属性的属性:
无效:(因为没有命名的标签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 中完成吗?

4

2 回答 2

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>
于 2013-08-19T12:04:20.183 回答
0

这个特殊的用例可以通过声明model/@name是一个来实现ID,并且word/@key是一个IDREF

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

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

于 2013-08-19T11:45:22.420 回答