我想为一个属性引用一个属性,所以我可以限制用户不要忘记写另一个标签中没有相同属性的属性
例如:
无效:(因为没有名为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中完成吗?
答案 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>