我的架构允许特定元素是可选的,但是当我稍后在文件中遇到不同的可选元素时,我需要存在前一个元素。如何通过XSD确保这一点?
示例:
<settings>
<file name="narf.txt"/>
<metafile name="narf.meta"/>
<filtermeta>true</filtermeta>
</settings>
应该有效,
<settings>
<file name="narf.txt"/>
<metafile name="narf.meta"/>
</settings>
和
<settings>
<file name="narf.txt"/>
</settings>
也应该有效,
<settings>
<file name="narf.txt"/>
<filtermeta>true</filtermeta>
</settings>
不应该有效。
答案 0 :(得分:3)
尝试以下架构定义:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="settings">
<xs:complexType>
<xs:sequence>
<xs:element name="file">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:sequence minOccurs="0">
<xs:element name="metafile">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="filtermeta" type="xs:string"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我使用xmllint对这个架构运行了前三个示例,并且它们正确验证。第四个例子失败了:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'filtermeta'. One of '{metafile}' is expected.
正如所料。
答案 1 :(得分:0)
您可以将filtermeta
作为metafile
元素的可选属性。