Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Использование правил шаблона



<! -- Category: instruction --> < xsl: apply-templates select = node-set-expression mode = qname> <! -- Content: (xsl: sort | xsl: with-param)* --> < /xsl: apply-templates>   В отсутствие атрибута select инструкция xsl: apply-templates обрабатывает все непосредственные потомки текущего узла, включая узлы текста. Чтобы обрабатывать не все непосредственные потомки, а лишь узлы, отобранные по некому выражению, может использоваться атрибут select. Значением атрибута select является выражение. После обработки этого выражения должен получиться набор узлов.

 

Именованные шаблоны

<! -- Category: instruction --> < xsl: call-template name = qname> <! -- Content: xsl: with-param* --> < /xsl: call-template>   Шаблоны можно вызывать по имени. Именованный шаблон задается элементом xsl: template с атрибутом name. Значением атрибута является имя name. Если элемент xsl: template имеет атрибут name, то он может, но не обязан, иметь также атрибут match. Элемент xsl: call-template вызывает шаблон по имени, он содержит обязательный атрибут name, идентифицирующий шаблон, который должен быть вызван. В отличие от xsl: apply-templates, xsl: call-template не меняет текущий узел и текущий набор узлов.  

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

Использование именованных шаблонов как функций обуславливается следующими тезисами.

· Именованный шаблон можно вызывать вне зависимости от того, какая часть документа обрабатывается в данный момент.

· Именованному шаблону можно передавать параметры.

· Результат выполнения именованного шаблона можно присваивать переменной.

Вызов именованного шаблона выполняется элементом xsl: call-template, в атрибуте name которого указывается имя вызываемого шаблона. Такой вызов не зависит от того, какая часть документа обрабатывается в данный момент и может производиться по необходимости.

Параметры именованному шаблону передаются точно так же, как и обычному — при помощи элементов xsl: with-param, которые могут быть включены в вызывающий элемент xsl: call-template. Примером вызова именованного шаблона с параметрами может быть конструкция вида

< xsl: call-template name=" foo" >

< xsl: with-param name=" x" select=" 1" />

< xsl: with-param name=" y" select=" 2" />

< /xsl: call-template>

которая вызывает шаблон с именем foo и передаёт ему параметр x со значением, равным 1 и параметр y со значением, равным 2.

Вызов именованного шаблона может также производиться при инициализации переменной — внутри элемента xsl: variable. В этом случае с переменной связывается результирующий фрагмент дерева, возвращаемый именованным шаблоном.

В качестве примера приведём простой шаблон, который вычисляет квадрат переданного ему параметра x:

< xsl: template name=" sqr" >

< xsl: param name=" x" />

< xsl: value-of select=" $x * $x" />

< /xsl: template>

Для того чтобы присвоить переменной y квадрат числа 6 мы можем записать следующее:

< xsl: variable name=" y" >

< xsl: call-template name=" sqr" >

< xsl: with-param name=" x" select=" 6" />

< /xsl: call-template>

< /xsl: variable>

 

Билет4

Структура XML документов. Язык схем RELAX NG.

Некоторые разработчики признали DTD не эффкективным, т.к.: 1) DTD имеет не XML синтаксис; 2) DTD имеет слишком ограниченные возможности и не дает разработчикам определять все необходимые в реальном мире ограничения на структуру документа.

В ответ на эту проблему в W3C был разработан новый язык описания структуры документа, названный W3C Schema. Новый язык решал выше перечисленные проблемы DTD: он является XML приложением, и позволят описывать все мыслимые виды ограничений на структуру документа. Однако за это решение пришлось заплатить излишней сложностью. Параллельно этому, на основе языков TREX и RELAX был разработан язык схем, названный RELAX NG, и многие разработчики нашли, что это как раз то, что нужно. RELAX NG записывается в форме XML, позволяет описывать почти такие же сложные структуры как W3C Schema, но намного более простым способом.

Для проверки RELAX NG схемвозьмем XML файл, приведенный в примере 3.21:

 

<? xml version=" 1.0"? >

< memories>

< memory tapeid=" 1" >

< media mediaid=" 1" status=" vhs" />

< subdate> 2001-05-23< /subdate>

< donor> John Baker< /donor>

< subject> Fishing off Pier 60< /subject>

< location>

< description> Outside in the woods< /description>

< /location>

< /memory>

< memory tapeid=" 2" >

ibm.com/developerWorks developerWorks

Understanding RELAX NG

© Copyright IBM Corporation 2006. All rights reserved. Page 3 of 31

< media mediaid=" 2" status=" vhs" />

< subdate> 2001-05-18< /subdate>

< donor> Elizabeth Davison< /donor>

< subject> Beach volleyball< /subject>

< location>

< place> Clearwater beach< /place>

< /location>

< /memory>

< /memories>

 

Пример 3.21. Исходный файл для тестирования RELAX NG

Скелет

Начнем создавать RELAX NG схему для нашего документа с добавления в нее основных элементов. Для этого просто будем описывать их в синтаксисе RELAX NG в том порядке вложенности, как они встречаются в документе.

<? xml version=" 1.0"? >

< grammar xmlns=" http: //relaxng.org/ns/structure/1.0" >

< start>

< element name=" memories" >

< element name=" memory" >

< element name=" media" />

< element name=" subdate" >

< text />

< /element>

< element name=" donor" >

< text />

< /element>

< element name=" subject" >

< text />

< /element>

< element name=" location" >

< text />

< /element>

< /element>

< /element>

< /start>

< /grammar>

 

Пример 3.23. Определение элементов в RELAX NG

 

Добавляем атрибуты

Давайте посмотрим на пример 3.24, в котором добавлены определения

<? xml version=" 1.0"? >

< grammar xmlns=" http: //relaxng.org/ns/structure/1.0" >

< start>

< element name=" memories" >

< element name=" memory" >

< attribute name=" tapeid" >

< text />

< /attribute>

< element name=" media" >

< attribute name=" mediaid" >

< text />

< /attribute>

< attribute name=" status" >

< text />

< /attribute>

< /element>

< element name=" subdate" >

< text />

< /element>

< element name=" donor" >

< text />

< /element>

< element name=" subject" >

< text />

< /element>

< element name=" location" >

< text />

< /element>

< /element>

< /element>

< /start>

< /grammar>

 

Пример 3.24. Добавляем атрибуты в RELAX NG

 

Если мы теперь проверим соответствие исходного файла и этой схемы, то получим только ошибки, касающиеся элемента location.

 

Смешанное содержимое

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

Определение смешанного содержимого, т.е. такого содержимого в котором вперемешку могут встречаться элементы и текст - это одна из вещей, которые сложно выполнить в DTD. В RELAX NG эта проблема решается легко, если вы используете элемент mixed, как это показано в примере 3.25.

< element name=" subject" >

< mixed>

< element name=" b" > < text /> < /element>

< element name=" i" > < text /> < /element>

< /mixed>

< /element>

 

Пример 3.25. Смешанное содержимое в RELAX NG

 

В этом примере элемент subject может содержать как текст, так и один элемент b или один элемент i.

Опциональные элементы

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

< element name=" subject" >

< mixed>

< optional>

< element name=" b" > < text /> < /element>

< /optional>

< optional>

< element name=" i" > < text /> < /element>

< /optional>

< /mixed>

< /element>

Пример 3.26. Опциональные элементы в RELAX NG

Альтернатива

В некоторых случаях бывает необходимо не просто указать, что тот или иной элемент является необязательным, а определить список альтернативных, взаимоисключающих элементов. Например, в нашем документе элемент location может содержать либо элемент description либо элемент place.

 

< element name=" location" >

< choice>

< element name=" description" > < text/> < /element>

< element name=" place" > < text/> < /element>

< /choice>

< /element>

Пример 3.27. Альтернатива

Когда в качестве альтернативных вариантов выступают не один а несколько элементов, можно группировать эти элементы конструкцией group.

Множественные вхождения

Иногда бывает необходимо указать, что тот или иной элемент может встретиться в этом месте какое-то определенное количество раз. Например, в нашем случае, можно указать, что элемент memory встречается внутри элемента memories один или более раз.

<? xml version=" 1.0"? >

< grammar xmlns=" http: //relaxng.org/ns/structure/1.0" >

< start>

< element name=" memories" >

< oneOrMore>

//здесь идет перечисление всех необходимых элементов

< /oneOrMore>

< /element>

< /start>

< /grammar>

Пример 3.28. Множественность вхождений в RELAX NG

Подобным же образом можно использовать конструкцию zeroOrMore, чтобы указать, что элемент может встречаться ноль или более раз.

Недостатком RELAX NG в этой части является то, что вы не можете указывать максимальное количество повторений элемента. Когда такая необходимость встречается, приходится искать обходные пути.

Неупорядоченные группы

Когда вам нужно указать, что здесь могут встречаться какие то определенные элементы, но их порядок не важен, воспользуйтесь конструкцией interleave.

Списки

Списки позволяют определить, что элемент или атрибут содержит внутри себя несколько значений, разделенных пробелами.

< element name=" media" >

< attribute name=" mediaid" > < text /> < /attribute>

< attribute name=" status" >

< list>

< oneOrMore> < text /> < /oneOrMore>

< /list>

< /attribute>

< /element>

Пример 3.30. Списки значений в RELAX NG

 

Полная гибкость

В завершение этого раздела добавим в нашу схему конструкцию, которая позволяет пользователю вставлять в определенном месте любой элемент, т.е. элемент с любым именем.

< mixed>

< zeroOrMore>

< element>

< anyName />

< text />

< /element>

< /zeroOrMore>

< /mixed>

< /element>

Пример 3.31. Произвольное имя элемента в RELAX NG

 

В этом примере пользователь может добавить в элемент subject любое количество любых элементов, содержащих внутри себя только текст.

 

2. Язык преобразования XML документов - XSLT. Назначение, общая структура и основные понятия. Параметризация стилей. Переменные.

<! -- Category: top-level-element -->
<! -- Category: instruction -->
< xsl: variable
name = qname
select = expression>
<! -- Content: template -->
< /xsl: variable>

<! -- Category: top-level-element -->
< xsl: param
name = qname
select = expression>
<! -- Content: template -->
< /xsl: param>

Переменная - это имя, которое может быть связано со значением. Значение, к которому привязана переменная, ( значение переменной) может быть объектом любого типа, который может быть возвращен выражением. Для привязки переменных могут использоваться два элемента: xsl: variable и xsl: param. Разница между ними заключается в том, что значение, указанное в переменной xsl: param, является лишь значением по умолчанию. Если используется шаблон или стиль, в котором используется элемент xsl: param, то могут быть переданы параметры, которые будут использоваться вместо значений по умолчанию.

И xsl: variable, и xsl: param имеют обязательный атрибут name, задающий имя переменной. Значением атрибута name является QName, которое приводится к расширенному имени как описано в главе [ 2.4 Полные имена ].

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

 

< xsl: stylesheet

version=" 1.0"

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

xmlns: fo=" http: //www.w3.org/1999/XSL/Format"

xmlns: axsl=" http: //www.w3.org/1999/XSL/TransformAlias" >

 

< xsl: namespace-alias stylesheet-prefix=" axsl" result-prefix=" xsl" />

< xsl: template match=" /" >

< axsl: stylesheet>

< xsl: apply-templates/>

< /axsl: stylesheet>

< /xsl: template>

< /xsl: stylesheet>

 

<! -- Category: instruction -->
< xsl: apply-templates
select = node-set-expression
mode = qname>
<! -- Content: (xsl: sort | xsl: with-param)* -->
< /xsl: apply-templates>

элемент xsl: apply-templates рекурсивно обрабатывает непосредственные потомки данного исходного элемента.

В отсутствие атрибута select инструкция xsl: apply-templates обрабатывает все непосредственные потомки текущего узла, включая узлы текста. Однако те текстовые узлы, которые были вычищены как описано в главе [ 3.4 Удаление пробельных символов ], обрабатываться не будут. Если очистка узлов с пробельными символами для элемента не была разрешена, то все пробельные символы в содержимом этого элемента будут обрабатываться как текст, и, следовательно, пробельный символ между элементами - непосредственными потомками будет учитываться при вычислении положения элемента - непосредственного потомка, возвращаемого функцией position.

Чтобы обрабатывать не все непосредственные потомки, а лишь узлы, отобранные по некому выражению, может использоваться атрибут select. Значением атрибута select является выражение. После обработки этого выражения должен получиться набор узлов. Если нет указаний по сортировке (см. [ 10 Сортировка ]), собранный перечень узлов обрабатывается в том порядке, как они следуют в документе. В следующем примере обрабатываются все непосредственные потомки author для этого элемента author-group:

< xsl: template match=" author-group" > < fo: inline-sequence> < xsl: apply-templates select=" author" /> < /fo: inline-sequence> < /xsl: template>

В следующем примере обрабатываются все содержащиеся в author элементы given-name, которые являются непосредственным потомком author-group:

< xsl: template match=" author-group" > < fo: inline-sequence> < xsl: apply-templates select=" author/given-name" /> < /fo: inline-sequence> < /xsl: template>

В данном примере обрабатываются все элементы heading, являющиеся потомками элемента book.

< xsl: template match=" book" > < fo: block> < xsl: apply-templates select=".//heading" /> < /fo: block> < /xsl: template>

Есть также возможность обрабатывать элементы, которые не являются потомками текущего узла. В данном примере предполагается, что элемент department имеет непосредственный потомок group и потомки employee. Сперва находится отдел employee, а затем обрабатывается непосредственный потомок group элемента department.

< xsl: template match=" employee" > < fo: block> Employee < xsl: apply-templates select=" name" /> belongs to group < xsl: apply-templates select=" ancestor:: department/group" /> < /fo: block> < /xsl: template>

<! -- Category: instruction -->
< xsl: for-each
select = node-set-expression>
<! -- Content: (xsl: sort*, template) -->
< /xsl: for-each>

Если результат имеет известную регулярную структуру, полезно иметь возможность указать это прямо в шаблоне для собираемых узлов. Инструкция xsl: for-each содержит шаблон, который обрабатывается для каждого узла, отобранного выражением, указанным в атрибуте select. Атрибут select является обязательным. Результатом обработки выражения должен быть набор узлов. При обработке шаблона выбранный узел берется в качестве текущего узла, а весь список собранных узлов берется в качестве текущего набора узлов. Узлы обрабатываются в том порядке как они следуют в документе, если нет указаний относительно сортировки (см. [ 10 Сортировка ]).

 

например:

< xsl: variable name=" url" select=" 'http: //www.xsltdev.ru'" />

 

создаст переменную с именем url и присвоит ей строковое значение " http: //www.xsitdev.ru". После этого переменную можно использовать в выражениях, например:

< xsl: value-of select=" concat('Welcome to ', $url)" />

 

Для того чтобы отличать переменные от путей выборки, в выражениях их именам предшествует префикс " $": к значению переменной с именем url мы обращались как к $url.

Каждая из переменных имеет собственную область видимости (англ. visibility scope) — область документа преобразования, в которой может быть использовано ее значение. В зависимости от этого переменные могут быть глобальными (видимыми во всем преобразовании) и локальными (видимыми только в своем родительском элементе).

Помимо переменных, в преобразованиях и шаблонных правилах могут также определяться параметры. Принцип их действия полностью совпадает с принципом действия переменных с той лишь разницей, что значения, присваиваемые параметрам, являются значениями по умолчанию и могут быть изменены извне — например, вызывающим шаблонное правило элементом типа xsl: apply-templates или xsl: call-template, или самим процессором, если речь идет о глобальных параметрах.

Использование переменных и параметров в XSLT отличается от их использования в привычных процедурных языках программирования типа C++, Java или Object Pascal из-за того, что их значения не могут изменяться. После того, как переменной или параметру присвоено некоторое изначальное значение, оно будет оставаться неизменным.

Параметры передаются шаблонам с помощью элемента xsl: with-param. Обязательный атрибут name сообщает название параметра (переменной, значение которой должно быть изменено). Значением атрибута name является QName, процедура приведения которого к расширенному имени описана в главе [2.4 Полные имена]. xsl: with-param можно использовать для xsl: call-template и для xsl: apply-templates.

Чтобы вставить фрагмент конечного дерева в конечное дерево без предварительного преобразования в строку, как это делает xsl: value-of (см. [7.6.1 Создание текста с помощью xsl: value-of]), можно использовать элемент xsl: copy-of. Обязательный атрибут select содержит выражение. Если результатом обработки выражения является фрагмент конечного дерева, то этот фрагмент целиком копируется в конечное дерево. Если же результатом является набор узлов, в конечное дерево копируются все узлы этого набора и в том порядке, как они были в документе. Когда копируется узел элемента, вместе с самим узлом элемента копируются также узлы атрибутов, узлы пространства имен и непосредственные потомки этого узла элемента. Копирование корневого узла выполняется копированием его непосредственных потомков. Если результат не является ни набором узлов, ни фрагментом конечного дерева, то он преобразуется в строку, а затем помещается в конечное дерево, как при использовании xsl: value-of.

Параметризованная сортировка

< xsl: template match=" my: for-each-album[@sort-by]" >

< xsl: variable

name=" sort-by"

select=" @sort-by" />

< xsl: variable

name=" current"

select="." />

< xsl: for-each

select=" $source/collection/album" >

< xsl: sort

select=" *[local-name() = $sort-by]" />

< xsl: apply-templates

select=" $current/node()" >

< xsl: with-param

name=" current-album"

select="." />

< /xsl: apply-templates>

< /xsl: for-each>

< /xsl: template>

 

 

Билет5


Поделиться:



Популярное:

  1. I. Выберите один правильный ответ.
  2. I: Указать номер правильного ответа
  3. III. Правила исполнения обязанности по уплате налогов и сборов
  4. III. Практическое использование водорослей.
  5. IV. Виды бланков документов, их изготовление и использование
  6. VI. Переведите на английский язык предложения с использованием форм простого будущего времени, либо других способов выражения будущего.
  7. XI. СОВРЕМЕННАЯ КОММУНИКАЦИЯ И ПРАВИЛА РЕЧЕВОГО ОБЩЕНИЯ
  8. А натолкнул меня на такую мысль и на раскрутку всей это ситуации именно грязно-зеленый цвет, который просто был нами правильно принят и расшифрован.
  9. Административная ответственность за нарушение правил регистрации
  10. Административно-правовой статус закреплен в Конституции РФ, законах и в нормативных актах (как правило, положениях об органах).
  11. Активность ионов. Правило ионной силы
  12. Алгоритм выполнения чертежей с использованием


Последнее изменение этой страницы: 2016-08-24; Просмотров: 619; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.101 с.)
Главная | Случайная страница | Обратная связь