只有一个子元素可以具有给定值
Only one child element may have a given value
我正在努力完成以下工作,这是我的 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>
我已经坚持了一段时间,尝试了从断言、替代方案到限制的几乎所有方法,但没有任何效果,所以我绝望地尝试了选择语句。
希望有人能理解我正在尝试做的事情并解释如何完成它。
您无法在 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>
我正在努力完成以下工作,这是我的 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>
我已经坚持了一段时间,尝试了从断言、替代方案到限制的几乎所有方法,但没有任何效果,所以我绝望地尝试了选择语句。 希望有人能理解我正在尝试做的事情并解释如何完成它。
您无法在 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>