XSD 基于属性值的子元素可选还是必需?
XSD optional vs required for child elements based on attribute value?
我有一个这样的 xml 结构。我想进行模式 (XSD) 验证,使 <DataRequest>
节点的 Name 属性值 <Bob>
和 <Rob>
可选:
<Request>
<DataRequest Name="Bob"></DataRequest>
<DataRequest Name="Rob"></DataRequest>
<DataRequest Name="Smith"></DataRequest>
<DataRequest Name="Andy"></DataRequest>
</Request>
我已经对可能的 Name 属性值进行了验证,但我无法将某些值设为可选:
<xs:element maxOccurs="unbounded" name="DataRequest" >
<xs:complexType>
<xs:attribute name="Name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Bob" />
<xs:enumeration value="Rob"/>
<xs:enumeration value="Andy"/>
<xs:enumeration value="Smith/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
XSD1.0
可选性不能依赖于 XSD 1.0 中的属性值,但是如果您重新设计 XML,
<Request>
<Bob></Bob>
<Rob></Rob>
<Smith></Smith>
<Andy></Andy>
</Request>
您可以简单地使用 minOccurs="0"
来指定可以省略 Bob
和 Rob
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="Bob" minOccurs="0"/>
<xs:element name="Rob" minOccurs="0"/>
<xs:element name="Smith"/>
<xs:element name="Andy"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSD1.1
您可以使用 xs:assert
根据属性值指定 optionality/requiredness。
在这里,我们断言其他枚举是必需的,留下 Bob
和 Rob
可选:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="DataRequest" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Bob"/>
<xs:enumeration value="Rob"/>
<xs:enumeration value="Andy"/>
<xs:enumeration value="Smith"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:assert test="DataRequest[@Name='Smith']"/>
<xs:assert test="DataRequest[@Name='Andy']"/>
</xs:complexType>
</xs:element>
</xs:schema>
我有一个这样的 xml 结构。我想进行模式 (XSD) 验证,使 <DataRequest>
节点的 Name 属性值 <Bob>
和 <Rob>
可选:
<Request>
<DataRequest Name="Bob"></DataRequest>
<DataRequest Name="Rob"></DataRequest>
<DataRequest Name="Smith"></DataRequest>
<DataRequest Name="Andy"></DataRequest>
</Request>
我已经对可能的 Name 属性值进行了验证,但我无法将某些值设为可选:
<xs:element maxOccurs="unbounded" name="DataRequest" >
<xs:complexType>
<xs:attribute name="Name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Bob" />
<xs:enumeration value="Rob"/>
<xs:enumeration value="Andy"/>
<xs:enumeration value="Smith/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
XSD1.0
可选性不能依赖于 XSD 1.0 中的属性值,但是如果您重新设计 XML,
<Request>
<Bob></Bob>
<Rob></Rob>
<Smith></Smith>
<Andy></Andy>
</Request>
您可以简单地使用 minOccurs="0"
来指定可以省略 Bob
和 Rob
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="Bob" minOccurs="0"/>
<xs:element name="Rob" minOccurs="0"/>
<xs:element name="Smith"/>
<xs:element name="Andy"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSD1.1
您可以使用 xs:assert
根据属性值指定 optionality/requiredness。
在这里,我们断言其他枚举是必需的,留下 Bob
和 Rob
可选:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="DataRequest" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Bob"/>
<xs:enumeration value="Rob"/>
<xs:enumeration value="Andy"/>
<xs:enumeration value="Smith"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:assert test="DataRequest[@Name='Smith']"/>
<xs:assert test="DataRequest[@Name='Andy']"/>
</xs:complexType>
</xs:element>
</xs:schema>