Есть ли способ создать правило для проверки значения атрибута при наличии другого атрибута?

В настоящее время я работаю над простой схемой со встроенными правилами схемы. Одним из правил является проверка значения атрибута для определенного элемента с именем @handle, который должен начинаться, например, с 12345. Но если у того же элемента есть еще один необязательный атрибут с именем @remark, это правило не применяется, поскольку значение будет случайным.

У меня есть следующий XML:

<record handle="12345/random numbers"/>
<record handle="abcdef" remark="value"/>

И следующий фрагмент схемы:

<xs:element name="record">
        <xs:annotation>
            <xs:appinfo>
                <sch:pattern id="handle check"
                    xmlns:sch="http://purl.oclc.org/dsdl/schematron">
                    <sch:rule context="@handle and not(../@remark)">
                        <sch:assert test="starts-with(.,'12345')">Handle-id, should start with 12345</sch:assert>
                    </sch:rule>
                </sch:pattern>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="title" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="material" use="optional"/>
            <xs:attribute name="remark" type="coll:remark" use="optional"/>
            <xs:attribute name="handle" use="required">
            </xs:attribute>
        </xs:complexType>
    </xs:element>

Но используя это, я получаю ошибки компиляции таблиц стилей. Если я удаляю часть and not(../@remark), она работает нормально и создает ошибки в элементах с @remark, как и ожидалось, но я не могу этого исключить и мне интересно, возможно ли это вообще.


person Takenaka    schedule 28.03.2019    source источник
comment
Какое программное обеспечение вы используете? Что такое сообщение об ошибке компиляции?   -  person Tony Graham    schedule 28.03.2019
comment
@TonyGraham, я использую кислород, и я получаю сообщение об ошибке: Неожиданный токен и выход за пределы выражения.   -  person Takenaka    schedule 28.03.2019


Ответы (1)


@context в rule должен относиться к узлу. @handle — это узел, и @remark — тоже узел, но @handle and not(../@remark) — это выражение, которое принимает значение true или false. Это не узел.

Вы можете переписать rule/@context так:

@handle[not(../@remark)]

... который будет срабатывать на всех узлах атрибута @handle, у которых нет родственного атрибута @remark.

person Joshua Legler    schedule 28.03.2019
comment
Большое спасибо, Джошуа, за помощь. Это помогло. Еще достаточно, чтобы учиться! - person Takenaka; 28.03.2019