WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Советы » Усиленный XPath

Усиленный XPath


Дата публикации: 05-02-2008

Мощь Schematron - в использовании выражений XPath. В результате, к XML-документам можно обращаться с запросами по мощным моделям, обеспечивая проверку допустимости ограничений, которые невозможно объявить в DTDs. Давайте рассмотрим выделенные блоки модели "Структурная проверка допустимости" (Structural Validation) в RSS Schematron.


<?xml version="1.0"?>
<schema xmlns="http://www.ascc.net/xml/schematron">
 <pattern name="Structural Validation">
  <rule context="rss">
    <assert test="@version">
      An RSS version identifier should be supplied
    </assert>

Здесь контекст правила (rule context) - элемент rss. Элемент assert с помощью выражения XPath @version проверяет присутствие атрибута version. В случае, если сопоставляемый элемент rss не имеет атрибута version, обрабатывается содержимое элемента assert, то есть, в выходной таблице стилей создается текстовое сообщение, уведомляющее пользователя о необходимости идентификатора version.


<report test="@version != 0.91">
  This Schematron validator is for RSS 0.91 only
</report>

В этом примере содержимое элемента report обрабатывается только тогда, когда выражение test выдает значение истина. В этом случае, Schematron проверяет номер версии отличный от 0.91.


<assert test="count(channel) = 1">
  An RSS element can only contain a single channel element
</assert>

А это более сложное ограничение. Оно проверяет, имеет ли контекстный узел (в данном случае /rss) только один элемент channel. Выражение test использует функцию XPath count, одну из многих мощных функций XPath, доступных в Schematron.

<rule context="title|description|link">
  <assert test="parent::channel or parent::image
      or parent::item or parent::textinput">
    A <name/> element can only be contained with a
    channel, image, item or textinput element.
  </assert>
  <report test="child::*">
    A <name/> element cannot contain sub-elements,
  &nb     remove any additional markup
  </report>
</rule>

Контекстный узел элемента rule в этом примере - элемент title, description, либо link. Элемент assert контролирует, что родитель контекстного узла - channel, image, item, либо textinput. Для проверки используется осевой спецификатор (axis specifier) parent.

Элемент report обеспечивает, что ни элемент title, description, ни link не содержат дочернего элемента. Для этого используется осевой спецификатор child.


rule context="image">
 ...
  <assert test="count(width) = count(height)">
    Width and Height elements should be balanced
  </assert>
</rule>

Вот еще один пример использования функции count для установки ограничения. И еще один случай, когда DTD не смог бы выразить это ограничение для проверки допустимости.

<rule context="width">
  <assert test="preceding::height or following::height">
    A width should be accompanied by a height
  </assert>
</rule>

Наконец, из этого примера просто видно, что Schematron может проверять. Элемент assert использует осевые спецификаторы XPath preceding и following для того, чтобы установить, сопровождает ли элемент height элемент width в случае появления последнего. И снова Schematron прибегает к мощным функциям XPath для описания ограничений, накладываемых на схему.

Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Неизвестный автор:

"Если ты загнал под бан – сайт и блог в придачу, про тебя на серче скажут – «криворукий мальчик»."

Опрос

Ваша техника?

Настольный компютер
Ноутбук
Смартфон
iPad
iPhone
другое