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


Цели и задачи консорциума W3C. Стек технологий W3C.



Билет 1

Цели и задачи консорциума W3C. Стек технологий W3C.

Консо́ рциум Всеми́ рной паути́ ны (англ. World Wide Web Consortium, W3C) — организация, разрабатывающая и внедряющая технологические стандарты для Всемирной паутины. Консорциум возглавляет Тим Бернерс-Ли, изобретатель HTTP, HTML, URI.

Консорциум был создан в 1994 году как консультативный орган для лидеров компьютерной индустрии. Крупнейшие мировые компании и корпорации договаривались в W3C об обеспечении совместимости своих продуктов и внедрении новых технологических стандартов.

Цели и задачи

W3C разрабатывает для Интернета единые принципы и стандарты (называемые «Рекоменда́ циями», англ. W3C Recommendations), которые затем внедряются производителями программ и оборудования. Таким образом достигается совместимость между программными продуктами и аппаратурой различных компаний, что делает Всемирную сеть более совершенной, универсальной и удобной.

Миссия W3C: «Полностью раскрыть потенциал Всемирной паутины, путём создания протоколов и принципов, гарантирующих долгосрочное развитие Сети».

Более конкретная цель W3C — помочь компьютерным программам достичь способности ко взаимодействию в Сети (т. н. «сетева́ я интеропера́ бельность», англ. Web interoperability). Применение единых стандартов в Сети — это ключевой шаг для достижения такого взаимодействия.

Принципы и концепции, утверждённые W3C

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

Аппаратная независимоть

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

Патентная политика. Здесь речь идёт о патентовании Рекомендаций W3C таким образом, чтобы их можно было внедрять бесплатно, на основе лицензии W3C Royalty-Free License.

Многоформенное взаимодействие. Принцип утверждает, что у программ должно существовать много форм и режимов взаимодействия с пользователем.

Семантическая паутина. Это новая концепция развития Всемирной паутины, которая призвана сделать размещённую в Сети информацию более понятной для компьютеров. Иногда также упоминается как семантический веб.

Мобильная паутина. Этот принцип определяет, что ресурсы Всемирной сети должны быть доступны для мобильных устройств.

Стек технологий

Стек технологий W3C иллюстрирует двухслойную модель: архитектура Веб (часто называемая " Единый Веб" ), построенная поверх архитектуры Интернет. На иллюстрации показаны технологии, разрабатываемые в консорциуме W3C.

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

· URI/IRI, HTTP

· Архитектурные принципы Веб

· XML infoset; RDF(S) графы

· XML, пространства имен, схемы, XQuery/XPath, XSLT, DOM, XML Base, XPointer RDF/XML, SPARQL

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

Розовая полоса (представляющая горизонтальные связи в консорциуме) соединяет все шесть подразделений и читается как: удобство Веб, интернационализация, мобильный доступ, независимость от устройств и гарантии качества.

W3C - это некоммерческая организация, целью которой является продвижение и развитие WEB.

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

WEB на любых устройствах: компьютерах, мобильных телефонах, PDA, бытовых приборах и любых устройствах, имеющих доступ к сети.

База знаний.

Язык XPath. Оси.

Язык XSL включает в себя три основных компоненты: XSL-FO, XSLT, XPath

XSL-FO (Formatting Objects). Печатные документы высокого качества.

XSLT (eXtensible Stylesheet Language for Transformations). Преобразование XML документов из одного формата (схемы) в другой.

XPath (XML Path Language). Язык описания положения элементов. Используется в XSLT и некоторых других приложениях. XML является языком, который позволяет вам определять, что нужно сделать, когда встречается определенный элемент. Но чтобы написать программу, для разных частей XML структуры, вы должны как-то обозначить, в каком случае о каких частях структуры идет речь. Языком для этого является язык XPath. Это механизм адресации, который дает вам возможность указать путь к элементу, так что, например, < article> < title> можно отличить от < person> < title>. Таким образом, можно определять различные преобразования для разных элементов < title>.

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

Выражение адресации состоит из последовательности шагов, разделенных символом /, например:

/self:: king_corp/child:: departments/

descendant:: employee[position()=1]

Выражение адресации очень напоминает полное имя файла в файловой системе. (Оси – маршруты поиска)

В таблице показаны некоторые возможные оси адресации (XQuery использует не все оси адресации XPath)

self:: name Сам контекстный узел .
child:: name Непосредственный потомок контекстного узла name
parent:: name Непосредственный предок контекстного узла ..
descendant:: name Все потомки контекстного узла //name
descendant-or-self:: name Контекстный узел и все его потомки  
ancestor:: name Все предки контекстного узла  
ancestor-or-self:: name Контекстный узел и все его предки  
attribute:: name Атрибут контекстного узла @name

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

Оси это база языка XPath.

• ancestor:: — Возвращает множество предков.

• ancestor-or-self:: — Возвращает множество предков и текущий элемент.

• attribute:: — Возвращает множество атрибутов текущего элемента.

• child:: — Возвращает множество потомков на один уровень ниже.

• descendant:: — Возвращает полное множество потомков.

• descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.

• following:: — Возвращает необработанное множество, ниже текущего элемента.

• following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.

• namespace:: — Возвращает множество имеющее пространство имён (то есть присутствует атрибут xmlns).

• parent:: — Возвращает предка на один уровень назад.

• preceding:: — Возвращает множество обработанных элементов исключая множество предков.

• preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.

• self:: — Возвращает текущий элемент.

Существуют сокращения для некоторых осей, например:

• attribute:: — можно заменить на «@»

• child:: — часто просто опускают

• descendant-or-self:: — можно заменить на «//»

• parent:: — можно заменить на «..»

• self:: — можно заменить на «.»

 

Пример:

Рассмотрим также путь адресации /html/body/*/span[@class] (полный синтаксис имеет вид /child:: html/child:: body/child:: */child:: span[attribute:: class]) который вернет набор из двух элементов исходного документа (< span class=" text" > первый блок в третьем слое< /span> и < span class=" text" > второй блок в третьем слое< /span> ). Путь делится на шаги адресации которые разделяются символом косая черта /. В свою очередь, каждый шаг адресации состоит из трех частей:

• ось (в данном примере child:: ), это обязательная часть;

• условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), это обязательная часть;

• предикат (в данном примере attribute:: class), необязательная часть заключаемая в квадратные скобки в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и проч.).

Анализ ведется слева направо. Если первый символ это /, то путь адресации считается абсолютным. При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.

На втором шаге адресации (child:: body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.

Третий шаг адресации: child:: *. Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.

 

Билет2

Структура XML документов. Определение типа документа (DTD)

Зачем может понадобиться определение структуры документа? Это может быть полезно при обмене XML документами между различными организациями или даже разными подразделениями одной организации. Наличие определения структуры позволит гарантировать (проверять) правильность получаемых и отдаваемых документов. Определение структуры документа может понадобиться разработчикам программного обеспечения. Например, разработчики СУБД могут формально определить допустимые структуры документов, которые разработчики сервера приложений могут отправлять в СУБД. Это позволит формально проверять корректность работы сервера приложений с СУБД, не обращаясь к разработчикам СУБД для тестирования. Ну и т.д.

Далее мы познакомимся с двумя способами определить структуру документа

Первый способ - использовать определение типа документа (Document Type Definition - DTD). DTD определяет элементы, которые можно использовать в XML документе; их содержимое; порядок, в котором они могут появляться в документе и другие детали структуры документа. Синтаксис DTD является частью спецификации XML.

Другой способ - использовать схемы. Схемы позволяют определять все то, что и DTD, а кроме этого еще и типы данных, более сложные структуры данных, чем в DTD. Существует несколько языков описания схем. Наиболее распространенные из них W3C XML Schema и RELAX NG. Мы будем изучать язык RELAX NG как более простой.

DTD позволяет нам определять базовую структуру XML документа. Давайте внимательно рассмотрим DTD (Пример 3.16, «DTD»), который определяет структуру XML документа, приведенного в первой части лекции (Пример 3.2, «Пример XML»).

< address>

< name>

< title> Mrs.< /title>

< first-name>

Mary

< /first-name>

< last-name>

McGoon

< /last-name>

< /name>

< street>

1401 Main Street

< /street>

< city> Anytown< /city>

< state> NC< /state>

< postal-code>

< /postal-code>

< /address>

Пример 3.2. Пример XML

<! -- address.dtd -->

<! ELEMENT address (name, street, city, state, postal-code)>

<! ELEMENT name (title? first-name, last-name)>

<! ELEMENT title (#PCDATA)>

<! ELEMENT first-name (#PCDATA)>

<! ELEMENT last-name (#PCDATA)>

<! ELEMENT street (#PCDATA)>

<! ELEMENT city (#PCDATA)>

<! ELEMENT state (#PCDATA)>

<! ELEMENT postal-code (#PCDATA)>

Пример 3.16. DTD

: • Элемент address содержит name, street, city, state и postal-code. Все эти элементы должны быть обязательно, и именно в этом порядке.

• Элемент name содержит опциональный (об опциональности говорит символ? ) элемент title, за которым следуют элементы first-name и last-name.

• Все остальные элементы содержат внутри себя текст (об этом говорит #PCDATA; вы не можете включать другие элементы в такой элемент).

Синтаксис DTD очень прост, но с его помощью легко описывать, какие элементы могут появляться в XML документе. С другой стороны, синтаксис DTD отличается от синтаксиса XML

Символы в DTD

Для указания того, как часто в XML документе могут использоваться те или иные элементы, используются специальные символы. Вот несколько примеров.

• В записи <! ELEMENT address (name, city, state)> элемент address должен содержать элементы name, city, state именно в этом порядке. Все они обязательны. Запятая определяет последовательность символов.

• Запись <! ELEMENT name (title?, first-name, last-name)> означает, что элемент name содержит опциональный элемент title, за которым следуют обязательные элементы first-name и last-name. Символ? означает, что элемент может появиться один раз или не появиться вообще.

• Запись <! ELEMENT addressbook (address+)> означает, что элемент addressbook содержит один или более элементов address. Символ + означает, что элемент должен встречаться как минимум один раз, но может и больше.

• Запись <! ELEMENT private-addresses (address*)> означает, что private-addresses может содержать ноль или более элементов address. Звездочка означает, что элемент может встречаться любое количество раз, в том числе и ноль.

• Запись <! ELEMENT name (title?, first-name, (middle-initial | middle-name)?, last-name)> означает, что элемент name содержит опциональный элемент title, за которым следует first-name. Далее возможны варианты: либо middle-initial, либо middle-name, но только что-нибудь одно. В конце обязательно присутствует элемент last-name. Вертикальная черта указывает на варианты. Может встретиться только один элемент из всех, разделенных вертикальной чертой. Обратите также внимание на то, как используются скобки для группировки элементов.

• Запись <! ELEMENT name ((title?, first-name, last-name) | (surname, mothers-name, given-name))> говорит о том, что элемент name может содержать одну из двух последовательностей: опциональный title, first-name и last-name; или surname, mothers-name, given-name.

Определение атрибутов

Очень глубоко в технологию DTD в этом курсе мы погружаться не будем, но некоторые основные вопросы затронем. Один из таких наиболее простых но важных вопросов - определение атрибутов. Для любого элемента можно определить:

• Какие атрибуты в нем могут быть

• Какие атрибуты обязательны

• Какие значения по умолчанию принимают атрибуты

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

Представьте, что вы хотите изменить DTD так, чтобы у элемента city был атрибут state (Пример 3.17, «Определение атрибута»).

<! ELEMENT city (#PCDATA)>

<! ATTLIST city state CDATA #REQUIRED>

Пример 3.17. Определение атрибута

Элемент city объявлен так же, как и раньше, но теперь для него добавлена инструкция ATTLIST, в которой определяется, что у элемента city есть атрибут state. Ключевое слово CDATA говорит анализатору, что атрибут state содержит внутри себя текст, а ключевое слово $REQUIRED говорит, что это обязательный атрибут. Если бы вы хотели указать, что атрибут необязательный, тогда вам необходимо использовать вместо #REQUIRED ключевое слово #IMPLIED (Пример 3.18, «Определение необязательного атрибута»).

<! ELEMENT city (#PCDATA)>

<! ATTLIST city state CDATA #IMPLIED>

Пример 3.18. Определение необязательного атрибута

В предыдущих примерах мы определяли только один атрибут. Чтобы определить несколько атрибутов, просто перечислите их в директиве ATTLIST (Пример 3.19, «Определение нескольких атрибутов»).

<! ELEMENT city (#PCDATA)>

<! ATTLIST city state CDATA #IMPLIED

postal-code CDATA #REQUIRED>

Пример 3.19. Определение нескольких атрибутов

И последнее, о чем мы упомянем в контексте DTD, это указание допустимых значений атрибута. Вы можете указать список значений, и анализатор будет контролировать, что атрибут принимает значения только из заданного списка значений. Кроме того, можно задать и значение по умолчанию (Пример 3.20, «Список допустимых значений атрибута, значение по умолчанию»).

<! ELEMENT city (#PCDATA)>

<! ATTLIST city state CDATA (AZ|CA|NV|OR|UT|WA) " CA" >

Пример 3.20. Список допустимых значений атрибута, значение по умолчанию

 

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

Определение правил шаблона

<! -- Category: top-level-element --> < xsl: template match = pattern name = qname priority = number mode = qname> <! -- Content: (xsl: param*, template) --> < /xsl: template>   Правило шаблона задается элементом xsl: template. Атрибут match соответствует образу, который идентифицирует исходные узел или узлы, к которым это правило применяется. Если элемент xsl: template не имеет атрибута name, атрибут match обязателен. Содержимое элемента xsl: template является шаблоном, который обрабатывается если данное правило шаблона задействовано.

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

<! -- 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

Скелет

Начнем создавать 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

Структура

Любой XHTML-файл состоит из четырех разделов — <! DOCTYPE>, контейнера < html>, заголовка (< head> ) и тела документа (< body> ). Последние два элемента перекочевали из HTML и ничем не отличаются от своего родоначальника (листинг 2.1).

Листинг 2.1. Простейший XHTML-документ

  1. <! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN" " http: //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
  2. < html xmlns=" http: //www.w3.org/1999/xhtml" >
  3. < head>
  4. <! -- Этот раздел предназначен для заголовка страницы и технической информации. -->
  5. < /head>
  6. < body>
  7. <! -- А здесь надо размещать все, что хочется увидеть на странице. -->
  8. < /body>
  9. < /html>

<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN" " http: //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< html xmlns=" http: //www.w3.org/1999/xhtml" >

< head>

<! -- Этот раздел предназначен для заголовка страницы и технической информации. -->

< /head>

< body>

<! -- А здесь надо размещать все, что хочется увидеть на странице. -->

< /body>

< /html>


Поделиться:



Популярное:

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


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