Как получить доступ к родительскому элементу в утверждении XSD XPath?

Я пытаюсь написать утверждение, которое сделает значения @row и @column меньше или равными значениям @rows и @columns в родительском элементе <structure>.

<xs:element name="structure">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="cell" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:attribute name="row" type="xs:positiveInteger"/>   
                    <xs:attribute name="column" type="xs:positiveInteger"/>
                    <xs:assert test="@row le @rows"/>
                    <xs:assert test="@column le @columns"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="rows" type="xs:positiveInteger" use="optional"/>
        <xs:attribute name="columns" type="xs:positiveInteger" use="optional"/>
    </xs:complexType>
</xs:element>

Мои утверждения не к месту? Какое выражение XPath использовать для указания родительского узла? Мой редактор не разрешает мне писать ..@rows.


person Misenus    schedule 12.05.2016    source источник
comment
как насчет ../@rows?   -  person har07    schedule 12.05.2016
comment
Не работает. Я попробовал значение 21 для @rows и значение 1 для @row и получил это сообщение об ошибке: Описание: cvc-assertion: оценка утверждения ("@row le ../@rows") для элемента "ячейка" в типе схемы " #AnonType_cellstructurebodypuzzle' не удалось.   -  person Misenus    schedule 12.05.2016
comment
@ har07: Это кажется логичным с точки зрения XPath, но утверждения XSD не могут получить доступ к узлам за пределами области действия управляющего элемента. Решение состоит в том, чтобы переместить утверждения в самый высокий контекст, в котором должны быть выражены ограничения.   -  person kjhughes    schedule 12.05.2016


Ответы (1)


XPath утверждения не может выйти за пределы своего контекста.

Итак, переместите ваше утверждение к элементу structure и используйте тест утверждения every ... satisfies:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified"
           vc:minVersion="1.1">
    <xs:element name="structure">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="cell" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="row" type="xs:positiveInteger"/>   
                        <xs:attribute name="column" type="xs:positiveInteger"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="rows" type="xs:positiveInteger" use="optional"/>
            <xs:attribute name="columns" type="xs:positiveInteger" use="optional"/>
            <xs:assert test="every $r in cell/@row satisfies @rows >= $r"/>
            <xs:assert test="every $c in cell/@column satisfies @columns >= $c"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
person kjhughes    schedule 12.05.2016
comment
Между прочим, процессор Saxon XSD 1.1 распознает утверждения в форме, в которой каждый X удовлетворяет T, и обрабатывает их особым образом, так как диагностика сообщает вам, какой X не удовлетворяет T. - person Michael Kay; 12.05.2016
comment
@MichaelKay, приятное прикосновение - гораздо полезнее, чем просто общий зачет/незачет. - person kjhughes; 12.05.2016