Валиков Алексей Н.
Шрифт:
Мы опишем два способа объединения документов и преобразований. Первый основывается на использовании инструкции
xml-stylesheet
для того, чтобы закрепить за документом преобразование, находящееся внутри него самого. Во втором способе обрабатываемый документ включается в преобразование как пользовательский элемент верхнего уровня и обрабатывается при помощи функции document('')
с пустым строковым параметром. Включение преобразования в документ
Корневой элемент преобразования
xsl:stylesheet
может быть включен в преобразуемый документ со всеми дочерними элементами верхнего уровня и так далее. Для того чтобы использовать это преобразование, псевдоатрибут href
инструкции по обработке xml-stylesheet
должен указывать на идентификатор элемента xsl:stylesheet
, определенный в его атрибуте id
. Пример
Листинг 4.20. Входящий документ
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="#"?>
<page>
<title>Main page</title>
<content>Main content</content>
<xsl:stylesheet
id="transform"
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<body title="{page/title}">
<xsl:text><xsl:value-of select="page/content"/></xsl:text>
</body>
</xsl:template>
<xsl:template match="xsl:stylesheet"/>
</xsl:stylesheet>
</page>
Листинг 4.21. Выходящий документ
<body title="Main page">
Main content
</body>
Поскольку элемент
xsl:stylesheet
включен в преобразуемый документ, он также подвергнется преобразованию. Для того чтобы избежать этого, в преобразование включается шаблонное правило, которое указывает, что элементы xsl:stylesheet
следует игнорировать: <xsl:template match="xsl:stylesheet"/>
К сожалению, приходится констатировать тот факт, что описанную возможность (хотя она и включена в спецификацию языка XSLT) поддерживают очень немногие процессоры и поэтому пока что на нее не следует полагаться.
Включение документа в преобразование
Другой возможностью объединения документов и преобразований является включение элемента документа в преобразование в виде элемента верхнего уровня.
Поскольку преобразование также является XML-документом, доступ к данным, которые оно содержит можно получить при помощи функции
document
, так же, как если бы документ преобразования был внешним документом. Функция document
, которой в качестве параметра была передана пустая строка, возвращает множество, состоящее из корневого узла самого преобразования. То есть, если документ был включен в преобразование в качестве элемента верхнего уровня с именем, к примеру, user:input
, получить доступ к нему можно при помощи выражения document('')/xsl:stylesheet/user:input
Пример
Листинг 4.22. Входящий документ
<whatever/>
Листинг 4.23. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:user="urn:user"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="user">
<input xmlns="urn:user">
<a/>
<b/>
</input>
<xsl:template match="/">
<xsl:apply-templates
select="document('')/xsl:stylesheet/user:input"/>
</xsl:template>
<xsl:template match="user:a">
<A/>
</xsl:template>