Мне нужна проверка правила в xsd для нахождения элемента, который ссылается на другой элемент, создающий цикл для примера:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:test.xsd">
<object>
<id>1</id>
<object-ref>4</object-ref>
<children>
<object>
<id>2</id>
<children>
<object>
<object-ref>3</object-ref>
<id>6</id>
</object>
<object>
<id>5</id>
</object>
</children>
</object>
</children>
</object>
<object>
<id>4</id>
<object-ref>1</object-ref>
</object>
</root>
в этом случае объект с id = 1 ссылается на объект с id = 4 и создает наоборот.цикл
Я пытался со следующим xsd:
<xs:element name="root">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="1">
<xs:element maxOccurs="unbounded" minOccurs="1" ref="object"/>
</xs:sequence>
</xs:complexType>
<xs:key name="id-key">
<xs:selector xpath=".//object"/>
<xs:field xpath="id"/>
</xs:key>
<xs:keyref name="id-key-ref" refer="id-key">
<xs:selector xpath=".//object"/>
<xs:field xpath="object-ref"/>
</xs:keyref>
</xs:element>
<xs:element name="object">
<xs:complexType>
<xs:all maxOccurs="1" minOccurs="0">
<xs:element maxOccurs="1" minOccurs="1" name="id">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:int"> </xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="children" nillable="true">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:element ref="object"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="object-ref" minOccurs="0" type="xs:int"/>
</xs:all>
<xs:assert test="not(exists(object-ref)) or object-ref != id"
xerces:message="object cannot refer it self"/>
<xs:assert test=" not(exists(object-ref)) or count(//object[id=object-ref and object-ref=id])=0"/>
</xs:complexType>
</xs:element>
бит не работает: строка
сгенерировала следующеепредупреждение: «Выражение утверждения XPath, например (« не (существует (объект-ссылка)) »или« счет »(// объект [идентификатор = объект-ссылка и объект-ссылка = идентификатор]) = 0 '), содержащее / или //,для типа схемы "#AnonType_object" не может быть получен действительный результат (поскольку дерево утверждений имеет корни в элементе без родителей). "