XSD是否可选vs基于属性值的子元素?

时间:2016-08-25 07:04:15

标签: xml xsd xsd-validation xml-validation

我有像这样的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>

1 个答案:

答案 0 :(得分:1)

XSD 1.0

Optionality不能依赖于XSD 1.0中的属性值,但如果重新设计XML,

<Request>
    <Bob></Bob>
    <Rob></Rob>  
    <Smith></Smith>  
    <Andy></Andy>  
</Request>

您可以轻而易举地使用minOccurs="0"来指定BobRob可能会被省略:

<?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>

XSD 1.1

您可以使用xs:assert根据属性值指定选项/必要性。

在这里,我们断言其他枚举是必需的,BobRob可选:

<?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>