Есть ли способ создать правило для проверки значения атрибута при наличии другого атрибута - PullRequest
0 голосов
/ 28 марта 2019

В настоящее время я работаю над простой схемой со встроенными правилами схематрона. Одним из правил является проверка значения атрибута в конкретном элементе с именем @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>

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

Спасибо заранее, пытаясь помочь мне!

1 Ответ

0 голосов
/ 28 марта 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...