XSD утверждать Elment существуют где угодно - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужна проверка правила в 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" не может быть получен действительный результат (поскольку дерево утверждений имеет корни в элементе без родителей). "

...