Литеральные элементы результата

Литеральные элементы результата

Как мы уже видели из множества примеров, преобразования состоят не только из элементов языка XSLT. Например, в шаблоне

<xsl:template match="b">

 <В/>

</xsl:template>

элемент B не принадлежит пространству имен XSLT и, следовательно, не считается XSLT-элементом. Такие элементы называются литеральными элементами результата (англ. literal result elements).

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

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

Пример

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

Теперь обратимся к случаю, когда один литеральный элемент будет включать другой:

<xsl:template match="a">

 <A>

  <B/>

 </A>

</xsl:template>

При выполнении этого шаблона процессор создаст элемент A и включит в него обработанное содержимое — то есть элемент B. Результатом этого шаблона будет XML-фрагмент:

<А>

 <В/>

</А>

Теперь попробуем включить в содержимое элемента инструкцию XSLT:

<xsl:template match="a">

 <А>

  <xsl:value-of select="." />

 </A>

</xsl:template>

При выполнении этого шаблона процессор создаст результирующий элемент а и включит в него результат выполнения его содержимого, то есть элемента xsl:value-of. Этот элемент создаст текстовый узел ей строковым значением текущего узла контекста преобразования. Например, если бы мы обрабатывали этим шаблоном элемент а вида

<a href="http://www.xsltdev.ru">Visit our site!</a>

результатом выполнения был бы следующий элемент:

<A>Visit out site!</A>

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

<xsl:template match="a">

 <A HREF="http://www.xsltdev.ru"

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

  <xsl:value-of select="." />

 </A>

</xsl:template>

будет элемент вида:

<A HREF="http://www.xsltdev.ru"

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

 Visit out site!

</A>

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

? Процессор не будет копировать атрибуты, принадлежащие пространству имен XSLT.

? Процессор не будет создавать узел пространства имен, соответствующий URI http://www.w3.org/1999/XSL/Transform, то есть URI пространства имен XSLT.

? Процессор не будет создавать узлы пространств имен, префиксы которых исключаются атрибутами exclude-result-prefixes самого литерального элемента или элемента xsl:stylesheet.

Пример

Листинг 4.26

<xsl:stylesheet

 version="1.0"

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

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

 <xsl:template match="/">

  <p

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

   xslt:exclude-result-prefixes="xhtml">

   <xslt:value-of select="2 * 2"/>

  </p>

 </xsl:template>

</xsl:stylesheet>

Обратим внимание на следующие особенности этого преобразования.

? В нем объявлено пространство имен с префиксом xhtml.

? Литеральный элемент p содержит объявление пространства имен с префиксом xslt и URI http://www.w3.org/1999/XSL/Transform.

? Литеральный элемент p содержит атрибут, xslt:exclude-result-prefixes, принадлежащий пространству имен XSLT.

Как ни странно, ни одно из этих объявлений не проникнет в выходящий документ, который будет иметь вид

<p>4</p>

Попробуем объяснить такой результат. Атрибут xslt:exclude-result-prefixes не был включен в результирующий элемент p, поскольку принадлежал пространству имен XSLT (отметим еще раз, что принадлежность эта определяется не префиксом, а значением URI). Далее, объявление пространства имен

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

которое содержалось в литеральном элементе p, не вошло в результат, потому что URI этого объявления совпадало с URI пространства имен XSLT. И, наконец, объявление пространства имен xhtml было исключено атрибутом exclude-result-prefixes.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

§ 2.3 Элементы описания книги. Базовые структурные элементы

Из книги Создание электронных книг в формате FictionBook 2.1: практическое руководство [Release 1.01 от 28.II.2010 г.] автора Кондратович Михаил Иосифович

§ 2.3 Элементы описания книги. Базовые структурные элементы В самом начале любого файла книги идет признак формата XML<?xml version="1.0" encoding="windows-1251"?>Здесь указана сигнатура принадлежности к формату XML, его версия и кодировка файла. Для русскоязычных FictionBook это обычно windows-1251


§ 2.4 Элементы описания книги (description). Элементы первого уровня

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

§ 2.4 Элементы описания книги (description). Элементы первого уровня Элемент title-infoСодержит базовую информацию о книге (заголовок, информация об авторе и переводчике, аннотация, вхождение в серию и т.д.)Cинтаксис: <title-info>content</title-info>.Используется в элементах: descriptionВложенные


§ 2.5 Элементы описания книги (description). Элементы второго уровня

Из книги MySQL: руководство профессионала автора Паутов Алексей В

§ 2.5 Элементы описания книги (description). Элементы второго уровня Элемент genreЖанр произведения.Содержимое элемента строго фиксировано и определяется файлом FictionBookGenres.xsd, входящим в состав спецификации FictionBook.Список жанров с переводом приведен в Приложении В.Cинтаксис:


§ 2.6 Элементы описания книги (description). Элементы третьего уровня (информация об авторе)

Из книги XSLT автора Хольцнер Стивен

§ 2.6 Элементы описания книги (description). Элементы третьего уровня (информация об авторе) Элемент first-nameИмя автора книги или документа, а также переводчика.Cинтаксис: <first-name>текст</first-name>Используется в элементах: author, translatorВложенные элементы: нетКоличество вхождений:


§ 2.8 Элементы раздела книги (section). Элементы первого уровня.

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

§ 2.8 Элементы раздела книги (section). Элементы первого уровня. Элемент citeЦитата. Отрывок текста из другого произведения.В FictionBook с помощью тэга cite также выделяются письма, записки, надписи, списки и еще много чего.Cинтаксис: <cite>content</cite>Используется в элементах: section,


§ 2.9 Элементы раздела книги (section). Элементы второго уровня.

Из книги Инфобизнес за один день автора Ушанов Азамат

§ 2.9 Элементы раздела книги (section). Элементы второго уровня. Элемент stanzaСтрофа стихотворения.Cинтаксис: stanza>content</stanza>Используется в элементах: poemВложенные элементы: title, subtitle, vКоличество вхождений: одно и болееАтрибуты: нетВерсия формата: 2.0Пример: см. пример


§ 2.11 Элементы абзаца (стилевые, они же inline элементы)

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

§ 2.11 Элементы абзаца (стилевые, они же inline элементы) Элемент aСсылка или сноска.Cинтаксис: <a>content</a>Используется в элементах: code, emphasis, p, strikethrough, strong, style, subtitle, sub, sup, th, td, vВложенные элементы:     code, emphasis, strikethrough, strong, style, sub, sup, imageКоличество вхождений:


Обозначение результата функции

Из книги автора

Обозначение результата функции Для понимания текстов функций rho, theta и distance в классе POINT необходимо еще одно соглашение.Любой язык программирования, поддерживающий функции (подпрограммы, возвращающие результат) должен предусматривать нотацию, позволяющую установить в


Присваивание функции результата

Из книги автора

Присваивание функции результата Присваивание функции результата является интересной языковой проблемой, обсуждение которой было начато ранее в данной лекции. Стоит изучить ее подробнее ввиду ее важности и для языков, не использующих ОО-подход.Рассмотрим функцию -


Элементы буквального результата

Из книги автора

Элементы буквального результата Если элемент в теле шаблона не является инструкцией XSL или элементом расширения, процессор XSLT должен рассматривать его в качестве элемента буквального результата. Это означает, что элемент должен трактоваться буквально и копироваться в


Возврат результата потока

Из книги автора

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


7. Программа на месяц до результата

Из книги автора

7. Программа на месяц до результата Некий тренинг, который вы ведете лично. Четыре недели подряд обучаете вашего клиента, ведете его за руку до мастерства, задаете домашние задания, проверяете их. Это своего рода коучинговая программа. Возможно, в вашей сфере сработает


12.1.2. Сохранение выходного результата

Из книги автора

12.1.2. Сохранение выходного результата Если нужно сохранить полученные результаты, следует переадресовать их в файл. В приведенном ниже примере выходной результат перенаправляется в файл с именем results.txt. В качестве входного используется файл oops.txt.$ tr -s "[a?z]" < oops.txt >


18.3.5. Проверка результата копирования файла

Из книги автора

18.3.5. Проверка результата копирования файла А теперь осуществим проверку того, успешно ли прошло копирование файла. Если команда cp не скопировала файл myfile в файл myfile.bak, отображается сообщение об ошибке. Обратите внимание, что в сообщении об ошибке фигурирует команда `basename