2017-07-12 47 views
0

考虑这个XSD架构,导致下面的图XSD架构唯一约束不适用于数值?

<?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> 

still passes validation

注意唯一约束的 “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:字符串

这将验证实例XML了,因为预期: fails validation as expected

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

问题是,如果这是一个错误或XSD的唯一约束实现中的已知限制?

回答

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 

和其他引擎。

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

+0

没有为你左右逢源从工种,独立?整数或字符串? – KarmaEDV

+0

我没有设置验证方案,除了默认设置。这是一个构建的XSD来展示这一点。我还没有尝试用代码中的SAXON库,这将是我的下一步。 – KarmaEDV

+0

我用Xerces引擎验证没有问题。 –

0

我想我发现问题所在。在oXygen中使用验证引擎Xerces时,如果元素的类型为int,则验证通过。当使用撒克逊引擎解析它时,无论哪种方式!

为此敢肯定这是在Xerces的的错误..

enter image description here