【问题标题】:Only one child element may have a given value只有一个子元素可能具有给定值
【发布时间】:2015-03-10 07:54:08
【问题描述】:

我正在尝试完成以下工作,这是我的 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>

我已经坚持了一段时间,尝试了几乎所有的东西,从断言、替代到限制,但没有任何效果,所以我拼命尝试了选择语句。 希望有人能得到我想要做的事情并解释如何完成它。

【问题讨论】:

    标签: xml xsd xml-validation


    【解决方案1】:

    您不能在 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>
    

    【讨论】:

    • 我不限于 XSD 1.0,正如我的问题中提到的那样,我已经尝试了 assert 语句,但它不起作用,你能给我一个工具来测试以下 XSD 吗?我想我正在使用 XSD 1.0 验证器来验证 XSD 1.1,谢谢
    • 我只是想省去您尝试其他 XSD 1.0 方法的麻烦,例如您提到的涉及 xsd:choice 的方法。我也不知道你是怎么用xsd:assert的,这很容易出错,所以我举了一个例子。支持 XSD 1.1 的处理器列于here
    猜你喜欢
    • 2018-03-10
    • 2019-01-12
    • 2018-08-09
    • 2019-03-26
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多