我有这个xsd文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http://HIDDEN/Queues"
xmlns="http://HIDDEN/Queues">
<xs:complexType name="Queue">
<xs:sequence>
<xs:choice>
<xs:sequence>
<xs:element fixed="1" name="id" type="xs:long"/>
<xs:element fixed="a" name="name" type="xs:string"/>
</xs:sequence>
<xs:sequence>
<xs:element fixed="2" name="id" type="xs:long"/>
<xs:element fixed="b" name="name" type="xs:string"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:schema>
目标是类型为 Queue 的元素应该如下所示:
<Queue>
<id>1</id>
<name>a</name>
</Queue>
但是一旦 id 或 name 不匹配(例如 id=2 name=a),它就会失败。
我感到困惑的部分是这个错误:
“http://HIDDEN/Queues”:id 和“http://HIDDEN/Queues”:id(或其替换组中的元素)违反“唯一粒子属性”。在针对此模式进行验证期间,这两个粒子将会产生歧义。
我的意思是我看到了它引用的内容,但这些元素不能同时存在,所以不知道如何解决这个问题。 我的一个想法是将 id 和 name 作为属性,但我的老板说我不能这样做(不要问我为什么)。
你们中有人知道其他方法吗? 预先感谢!
这是一个基于 XSD 1.1 的解决方案,它使用 assert 语句来强制执行 id 和 name 值的正确组合。
输入XML
<Queue xmlns="http://HIDDEN/Queues">
<id>1</id>
<name>a</name>
</Queue>
XSD 1.1
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="http://HIDDEN/Queues"
xmlns="http://HIDDEN/Queues"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="Queue">
<xs:complexType>
<xs:sequence>
<xs:element ref="id"/>
<xs:element ref="name"/>
</xs:sequence>
<xs:assert test="string-join((xs:string(id), name), '~') = ('1~a', '2~b')"
xpathDefaultNamespace="##targetNamespace">
<xs:annotation>
<xs:documentation>Rule #: 20-70</xs:documentation>
<xs:documentation>Combination of id and name values shall be correct</xs:documentation>
</xs:annotation>
</xs:assert>
</xs:complexType>
</xs:element>
<xs:element name="id" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
</xs:schema>