如何限制 XSD 中无序 XML 元素的数量?
How to limit number of unordered XML elements in XSD?
我有 XML 看起来像这样:
<Root id="1a">
<Name>TOM</Name>
<StudentID>123</StudentID>
<Description>Detailed description of the student</Description>
<Subjects>
<subject1>Chemistry</subject1>
<subject2>Physics</subject2>
<subject3>Maths</subject3>
<subject4>History</subject4>
<subject1>ChemistryLab</subject1>
</Subjects>
</Root>
约束条件:Subjects 元素必须至少有一个主题,最多有五个主题是以下元素的任意组合:subject1、subject2、subject3、subject4(即,如果所有五个输出将是 subject1,它仍然是 Subjects 元素的有效版本,这些元素出现的顺序也无关紧要。
已尝试XSD
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="SubjectsType">
<xs:sequence>
<xs:element name="subject1" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="subject2" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="subject3" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="subject4" type="xs:string" minOccurs="0" maxOccurs="5"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="RootType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="StudentID" type="xs:string"/>
<xs:element name="Description" type="xs:string"/>
<xs:element name="Subjects" type="SubjectsType"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
<xs:element name="Root" type="RootType"/>
</xs:schema>
实现目标的关键是将xs:choice
与minOccurs="1"
和maxOccurs="5"
一起使用:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="StudentID" type="xs:integer"/>
<xs:element name="Description" type="xs:string"/>
<xs:element name="Subjects">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="5">
<xs:element name="subject1" type="xs:string"/>
<xs:element name="subject2" type="xs:string"/>
<xs:element name="subject3" type="xs:string"/>
<xs:element name="subject4" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:schema>
这将允许 1 到 5 个子 subject(n in 1..4)
元素按要求按任何顺序排列,包括重复项。
我有 XML 看起来像这样:
<Root id="1a">
<Name>TOM</Name>
<StudentID>123</StudentID>
<Description>Detailed description of the student</Description>
<Subjects>
<subject1>Chemistry</subject1>
<subject2>Physics</subject2>
<subject3>Maths</subject3>
<subject4>History</subject4>
<subject1>ChemistryLab</subject1>
</Subjects>
</Root>
约束条件:Subjects 元素必须至少有一个主题,最多有五个主题是以下元素的任意组合:subject1、subject2、subject3、subject4(即,如果所有五个输出将是 subject1,它仍然是 Subjects 元素的有效版本,这些元素出现的顺序也无关紧要。
已尝试XSD
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="SubjectsType">
<xs:sequence>
<xs:element name="subject1" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="subject2" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="subject3" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="subject4" type="xs:string" minOccurs="0" maxOccurs="5"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="RootType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="StudentID" type="xs:string"/>
<xs:element name="Description" type="xs:string"/>
<xs:element name="Subjects" type="SubjectsType"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
<xs:element name="Root" type="RootType"/>
</xs:schema>
实现目标的关键是将xs:choice
与minOccurs="1"
和maxOccurs="5"
一起使用:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="StudentID" type="xs:integer"/>
<xs:element name="Description" type="xs:string"/>
<xs:element name="Subjects">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="5">
<xs:element name="subject1" type="xs:string"/>
<xs:element name="subject2" type="xs:string"/>
<xs:element name="subject3" type="xs:string"/>
<xs:element name="subject4" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:schema>
这将允许 1 到 5 个子 subject(n in 1..4)
元素按要求按任何顺序排列,包括重复项。