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 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 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

Друзья сайта



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

Thomas C. Gale:

"В хорошем дизайне добавление вещи стоит дешевле, чем сама эта вещь."

Опрос

Какой браузер Вы используете?

Internet Explorer
Google Chrome
Mozilla Firefox
Netscape Navigator
Maxthon Browser
Opera
Mozilla Suite
SeaMonkey
K-Meleon
Safari
Amaya
Avant Browser
SlimBrowser
Другой...