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>
Обратите внимание на уникальное ограничение, установленное для элемента "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 с уникальными ограничениями?
2 ответа
Ваш 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
и для других двигателей.
Попробуйте проверить свои сценарии проверки, кэширование и имена файлов.
Я думаю, что обнаружил, в чем проблема. При использовании механизма проверки Xerces в oXygen проверка проходит, если элемент имеет тип int. При использовании саксонского движка для разбора он работает в любом случае!
Поэтому я уверен, что это ошибка в Xerces.