Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

Рис. 6.11. Изображение графа, который мы будем описывать в XML

Каждой вершине будет соответствовать элемент

vertex
. Для того чтобы описать все связи, мы дадим каждой вершине уникальное имя, которое будет записано в ее
ID
– атрибуте
name
. Имена вершин, с которыми она соединена, будут перечислены в атрибуте
connects
типа
IDREFS
.

Документ, описывающий этот граф, может выглядеть следующим образом.

Листинг 6.13. Документ gemini.xsl

<!DOCTYPE vertices SYSTEM "gemini.dtd">

<vertices>

 <vertex name="alpha" connects="tau"/>

 <vertex name="beta" connects="upsilon"/>

 <vertex name="gamma" connects="zeta"/>

 <vertex name="delta" connects="zeta lambda upsilon"/>

 <vertex name="epsilon" connects="nu mu tau"/>

 <vertex name="zeta" connects="delta gamma"/>

 <vertex name="theta" connects="tau"/>

 <vertex name="iota" connects="tau upsilon"/>

 <vertex name="kappa" connects="upsilon"/>

 <vertex name="lambda" connects="delta xi"/>

 <vertex name="mu" connects="epsilon"/>

 <vertex name="nu" connects="epsilon"/>

 <vertex name="xi" connects="lambda"/>

 <vertex name="tau" connects="alpha theta iota epsilon"/>

 <vertex name="upsilon" connects="beta iota kappa delta"/>

</vertices>

Декларация типа документа вынесена во внешний файл

gemini.dtd
.

Листинг 6.14. Файл gemini.dtd

<!ELEMENT vertices (vertex*)>

<!ELEMENT vertex EMPTY>

<!ATTLIST vertex

 name ID #REQUIRED

 connects IDREFS #REQUIRED>

При обработке этого документа функция

id
будет очень полезна для выбора элементов соединенных вершин. Действительно, функция
id
, которой будет передано значение атрибута
connects
(в котором через пробелы перечислены вершины, смежные данной), возвратит множество, состоящее из элементов с перечисленными уникальными идентификаторами. Так, например, функция
id('tau upsilon')
возвратит множество, состоящее из двух элементов с атрибутами name, равными
tau
и
upsilon
соответственно.

Более того, функция

id
может быть вычислена и от множества узлов. В этом случае ее значением будет объединение множеств, полученных в результате выполнения функции от строкового значения каждого узла переданного множества. Например,
id(id('tau upsilon')/@connects)
возвратит множество, состоящее из вершин с именами
alpha
,
beta
,
delta
,
epsilon
,
theta
,
iota
и
kappa
— множество вершин, смежных с вершинами tau и upsilon.

Приведем пример преобразования, которое в каждый элемент

vertex
добавляет комментарий, в котором перечислены имена вершин, достижимых из текущей, не более чем за два шага.

Для того чтобы найти множество вершин, достижимых за один шаг (иначе говоря, смежных), мы воспользуемся выражением вида

id(@connects)
, для выборки множества вершин, достижимых из текущей за два шага — выражением
id(id(@connects)/@connects)
. Таким образом, множество вершин, достижимых не более чем за два шага, будет вычисляться как

id(@connects)|id(id(@connects)/@connects)

Листинг 6.15. Преобразование gemini.xsl

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output doctype-system="gemini.dtd"/>

 <xsl:template match="vertices">

<xsl:copy>

<xsl:apply-templates/>

  • Читать дальше
  • 1
  • ...
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: