Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
document('')/xsl:stylesheet/user:input
version="1.0"
xmlns:user="urn:user"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="user">
select="document('')/xsl:stylesheet/user:input"/>
Следует обратить внимание на следующие особенности этого примера.
□ Элементы верхнего уровня в обязательном порядке должны иметь ненулевое пространство имен. Поэтому мы включили элемент input
и все его дочерние узлы в пространство имен urn:user
. В листинге 4.23 эти элементы выделены полужирным шрифтом.
□ В шаблонах, которые обрабатывают элементы включенного документа, должны указываться паттерны, соответствующие расширенным именам этих элементов, то есть не input
, a user:input
.
□ Чтобы не выводить объявления пространств имен в выходящем документе, мы включили префикс user
в атрибут exclude-result-prefixes
элемента xsl:stylesheet
.
Как можно видеть, включение элемента input
как элемента верхнего уровня породило определенные проблемы. Для того чтобы избежать их, можно воспользоваться маленьким фокусом — включать документ не как элемент верхнего уровня, а в элемент верхнего уровня.
Результат следующего преобразования в точности совпадает с результатом преобразования в предыдущем примере.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
select="document('')/
xsl:stylesheet/xsl:template[@name='input']/input"/>
Хитрость заключается в том, что мы обрабатываем содержимое именованного шаблона, которое вполне может принадлежать нулевому пространству имен. Единственное, что следует иметь в виду — это то, что этот шаблон не должен конфликтовать с другими шаблонами.
В отличие от предыдущего варианта с преобразованием, включенным в документ, этот способ является гораздо более работоспособным. Минусом его является только то, что на вход все равно должен подаваться какой-нибудь XML-документ, даже если его содержимое и не обрабатывается.
Литеральные элементы результата
Как мы уже видели из множества примеров, преобразования состоят не только из элементов языка XSLT. Например, в шаблоне
<���В/>
элемент B
не принадлежит пространству имен XSLT и, следовательно, не считается XSLT-элементом. Такие элементы называются литеральными элементами результата (англ. literal result elements).
Когда процессор выполняет шаблон, содержащий литеральные результирующие элементы, для них в результирующем документе создаются элементы с тем же расширенным именем и атрибутами, содержимым которых является результат выполнения содержимого литерального элемента в преобразовании.
Попросту говоря, литеральные элементы выводятся в результирующий документ без изменений; но их содержимое при этом все же выполняется.
В предыдущем случае шаблон содержал пустой литеральный элемент B
. При выполнении этого правила процессор просто создаст в результирующем документе элемент с тем же расширенным именем и пустым содержимым — то есть это будет его точная копия.
Теперь обратимся к случаю, когда один литеральный элемент будет включать другой:
При выполнении этого шаблона процессор создаст элемент A
и включит в него обработанное содержимое — то есть элемент B
. Результатом этого шаблона будет XML-фрагмент:
<���А>
<���В/>
</А>
Теперь попробуем включить в содержимое элемента инструкцию XSLT:
<���А>
При выполнении этого шаблона процессор создаст результирующий элемент а и включит в него результат выполнения его содержимого, то есть элемента xsl:value-of
. Этот элемент создаст текстовый узел ей строковым значением текущего узла контекста преобразования. Например, если бы мы обрабатывали этим шаблоном элемент а
вида
Visit our site!
результатом выполнения был бы следующий элемент:
Visit out site!
При воссоздании литеральных элементов в результирующем документе, процессор копирует также все атрибуты и узлы пространств имен, которые ассоциируются с данным элементом. Например, результатом выполнения следующего шаблона:
xmlns:xhtml="http://www.w3.org/1999/xhtml">
будет элемент вида:
xmlns:xhtml="http://www.w3.org/1999/xhtml">
Visit out site!
Как можно заметить, процессор воссоздал не только сам элемент, но также его атрибуты и объявления пространств имен. В этом и есть смысл литеральных элементов — они копируются в выходящее дерево без изменений, хотя и здесь есть несколько исключений.
□ Процессор не будет копировать атрибуты, принадлежащие пространству имен XSLT.
□ Процессор не будет создавать узел пространства имен, соответствующий URI http://www.w3.org/1999/XSL/Transform
, то есть URI пространства имен XSLT.
□ Процессор не будет создавать узлы пространств имен, префиксы которых исключаются атрибутами exclude-result-prefixes
самого литерального элемента или элемента xsl:stylesheet
.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/XHTML">
xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
xslt:exclude-result-prefixes="xhtml">
Обратим внимание на следующие особенности этого преобразования.
□ В нем объявлено пространство имен с префиксом xhtml
.
□ Литеральный элемент p
содержит объявление пространства имен с префиксом xslt
и URI http://www.w3.org/1999/XSL/Transform
.
□ Литеральный элемент p
содержит атрибут, xslt:exclude-result-prefixes
, принадлежащий пространству имен XSLT.
Как ни странно, ни одно из этих объявлений не проникнет в выходящий документ, который будет иметь вид
4
Попробуем объяснить такой результат. Атрибут xslt:exclude-result-prefixes
не был включен в результирующий элемент p
, поскольку принадлежал пространству имен XSLT (отметим еще раз, что принадлежность эта определяется не префиксом, а значением URI
). Далее, объявление пространства имен
xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
которое содержалось в литеральном элементе p
, не вошло в результат, потому что URI этого объявления совпадало с URI пространства имен XSLT. И, наконец, объявление пространства имен xhtml
было исключено атрибутом exclude-result-prefixes
.
Атрибуты языка XSLT в литеральных элементах
Мы упомянули о том, что литеральные элементы могут содержать атрибуты, принадлежащие пространству имен XSLT. В табл. 4.3 они перечислены вместе с краткими описаниями назначения.
Читать дальшеИнтервал:
Закладка: