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

#xml #xsd #schema #schematron

#xml #xsd #схема #schematron

Вопрос:

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

Комментарии:

1. Какое программное обеспечение вы используете? Что это за сообщение об ошибке компиляции?

2. @TonyGraham, я использую oxygen, и я получаю ошибку: Неожиданный токен «и «за пределами конца выражения

Ответ №1:

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

Вы могли бы переписать rule/@context , чтобы быть:

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

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

Комментарии:

1. Большое спасибо Джошуа за вашу помощь. Это действительно помогло. Все еще достаточно, чтобы учиться!