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