0

考虑这个 XSD Schema,得到下图

<?xml version="1.0" encoding="UTF-8"?>
<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" 
    xmlns:target="http://www.url.com/validation" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <s:element name="myObjects" type="typeObjects">
        <s:unique name="uniqueObjectId">
            <s:selector xpath="myObject"/>
            <s:field xpath="id"/>
        </s:unique>
    </s:element>
    <s:complexType name="typeObjects">
        <s:sequence maxOccurs="unbounded">
            <s:element name="myObject">
                <s:complexType>
                    <s:complexContent>
                        <s:extension base="typeObject"/>
                    </s:complexContent>
                </s:complexType>
            </s:element>
        </s:sequence>
    </s:complexType>
    <s:complexType name="typeObject">
        <s:sequence>
            <s:element name="id" type="s:int"/>
        </s:sequence>
    </s:complexType>
</s:schema>

仍然通过验证

请注意在“id”元素上设置的唯一约束,类型为 s:int。

以下实例 XML 仍然有效,即使有<id>1</id>两次相同!

<?xml version="1.0" encoding="utf-8"?>
<myObjects 
    xmlns:target="http://www.url.ch/validation" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="unique.xsd">

    <myObject>
        <id>1</id>
    </myObject>

    <myObject>
        <id>1</id>
    </myObject>
</myObjects>

如果我将元素类型更改为s:string ,我可以强制失败条件

正如预期的那样,这将不再验证实例 XML: 按预期失败验证

我分别在 oXygen XML 和 ALtova XML Spy 中尝试了验证,结果相同。

问题显然是 XSD 的唯一约束实现中的错误或已知限制?

4

2 回答 2

0

我想我发现了问题所在。在 oXygen 中使用验证引擎 Xerces 时,如果元素的类型为 int,则验证通过。使用 Saxon 引擎进行解析时,无论哪种方式都可以!

因此很确定这是Xerces 中的一个错误..

在此处输入图像描述

于 2017-07-12T14:06:30.337 回答
0

你的 xsd 看起来不错,我用氧气确认了它。我得到了预期的错误:

cvc-identity-constraint.4.1: Duplicate unique value [1] declared for identity 
constraint "uniqueObjectId" of element "myObjects".

我看到验证适用于 SAXON-EE 9.6.0.7

Non-unique value found for constraint uniqueObjectId: 1

和其他引擎。

尝试检查您的验证方案、缓存和文件名。

于 2017-07-12T11:34:14.327 回答