XSD:仅限制一个子元素具有特定值

时间:2015-01-11 16:41:28

标签: xml xsd

我有一个读取

的XML
<Options>
  <option1>Y</option1>
  <option2>N</option2>
  <option3>N</option3>
</Options>

我想确保只有一个子元素(Options)具有值Y,以便上面的XML有效但不是下面的。

<Options>
  <option1>Y</option1>
  <option2>Y</option2>
  <option3>N</option3>
</Options>

我尝试了独特的参考完整性,但无法解决问题。

非常感谢任何帮助/想法。

1 个答案:

答案 0 :(得分:1)

您必须在XSD 1.0之外强制实施此约束,但您可以使用xs:assert强制执行 XSD 1.1

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" 
  elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">

  <xs:element name="Options">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="option1"/>
        <xs:element name="option2"/>
        <xs:element name="option3"/>
      </xs:sequence>
      <xs:assert test="count(* = 'Y') = 1"/>
    </xs:complexType>
  </xs:element>
 </xs:schema>

或者,为避免单独命名每个option

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" 
  elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">

  <xs:element name="Options">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="option" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:assert test="count(option = 'Y') = 1"/>
    </xs:complexType>
  </xs:element>
 </xs:schema>

如果需要,当然也可以将约束选项限制为YN