#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. Большое спасибо Джошуа за вашу помощь. Это действительно помогло. Все еще достаточно, чтобы учиться!