选择相似序列

问题描述 投票:0回答:1

我有这个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 作为属性,但我的老板说我不能这样做(不要问我为什么)。

你们中有人知道其他方法吗? 预先感谢!

xml xsd xsd.exe
1个回答
0
投票

这是一个基于 XSD 1.1 的解决方案,它使用 assert 语句来强制执行 idname 值的正确组合。

输入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>
© www.soinside.com 2019 - 2024. All rights reserved.