只有一个子元素可能具有给定值

时间:2015-01-12 14:07:39

标签: xml xsd xml-validation

我试图完成以下操作,这是我的XML文档:

<TEST>
  <A>X</A>
  <B>X</B>
  <C>Y</C>
</TEST>

所有三个元素A,B和C必须存在且其中只有一个必须具有Y值,其他元素必须具有X.

我使用了以下代码,但显然它不起作用:

<xsd:complexType name="TEST">
    <xsd:choice>
        <xsd:sequence>
            <xsd:element name="A" type="xsd:string" fixed="Y"/>
            <xsd:element name="B" type="xsd:string" fixed="X"/>
            <xsd:element name="C" type="xsd:string" fixed="X"/>
        </xsd:sequence>
        <xsd:sequence>
            <xsd:element name="A" type="xsd:string" fixed="X"/>
            <xsd:element name="B" type="xsd:string" fixed="Y"/>
            <xsd:element name="C" type="xsd:string" fixed="X"/>
        </xsd:sequence>
        <xsd:sequence>
            <xsd:element name="A" type="xsd:string" fixed="X"/>
            <xsd:element name="B" type="xsd:string" fixed="X"/>
            <xsd:element name="C" type="xsd:string" fixed="Y"/>
        </xsd:sequence>
    </xsd:choice>
</xsd:complexType>

我已经坚持了一段时间,尝试了几乎所有的东西,从断言,替代限制,但没有任何工作如此绝望,我尝试了选择声明。 希望有人得到我想要做的事情并解释如何实现它。

1 个答案:

答案 0 :(得分:0)

您无法在XSD 1.0中表示此类约束。您使用xs:choice的尝试违反了唯一粒子归因。如果您仅限于XSD 1.0,则必须在XSD之外强制执行该约束。

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="TEST">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="A" type="yorn"/>
        <xs:element name="B" type="yorn"/>
        <xs:element name="C" type="yorn"/>
      </xs:sequence>
      <xs:assert test="count(* = 'Y') = 1"/>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="yorn">
    <xs:restriction base="xs:token">
      <xs:enumeration value="Y"/>
      <xs:enumeration value="N"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>