我有像这样的xml结构。我想进行架构(XSD)验证,使<DataRequest>
节点的名称属性值<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>
答案 0 :(得分:1)
Optionality不能依赖于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>
您可以使用xs:assert
根据属性值指定选项/必要性。
在这里,我们断言其他枚举是必需的,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>