используют 'text/xsl
'.
Инструкция xml-stylesheet
может быть включена только в пролог документа, то есть она должна предшествовать корневому элементу. Не рекомендуется включать эту инструкцию в блоки DOCTYPE
, поскольку некоторые парсеры и процессоры будут ее в этом случае игнорировать.
Стандартный механизм использования xml-stylesheet
может быть продемонстрирован следующим документом:
<?xml version='1.0'?>
<?xml-stylesheet type='text/xsl' href='mytransform.xsl'?>
<body>
<!-- ... -->
</body>
В этом документе инструкция xml-stylesheet
указывает на то, что этот документ должен быть обработан XSLT-преобразованием mytransform.xsl
.
Псевдоатрибут title
может содержать краткое описание применяемого преобразования:
<?xml-stylesheet
title='Generate menu'
type='text/xsl'
href='menu.xsl'?>
Псевдоатрибуты media
и alternate
могут использоваться совместно для того, чтобы описать альтернативное представление документа, к примеру, на небольших мобильных устройствах:
<?xml-stylesheet
type='text/xsl'
href='pda.xsl'
alternate='yes'
media='handheld'?>
Теоретически, если документ с такой инструкцией будет показываться на мобильном устройстве (например, на Palm Pilot), он должен быть преобразован при помощи pda.xsl
. На практике не следует полагаться на подобные возможности, поскольку они сильно зависят от поддержки серверов и процессоров, которая в этом отношении все еще сильно ограничена.
В заключение описания инструкции xml-stylesheet
приведем правила, которые определяют ее синтаксис.
[XMS1] StyleSheetPI ::= '<?xml-stylesheet' (S PseudoAtt)* S? '?>'
[XMS2] PseudoAtt ::= Name S? '=' S? PseudoAttValue
[XMS3] PseudoAttValue ::= ( ''' ([^'<&]|CharRef|PredefEntityRef)* '''
| ''' ([^'<&]|CharRef|PredefEntityRef)* ''')
- (Char* '?>' Char*)
[XMS4] PredefEntityRef ::= '"' | '<'
| '>' | '&' | '''
Объединение документа и преобразования
XSLT-преобразование является, как правило, самостоятельным XML-документом, корневым элементом которого является xsl:stylesheet
или xsl:transform
. Вместе с тем, иногда бывает необходимо объединять преобразуемый документ и само преобразование так, чтобы они находились в одном файле.
Мы опишем два способа объединения документов и преобразований. Первый основывается на использовании инструкции xml-stylesheet
для того, чтобы закрепить за документом преобразование, находящееся внутри него самого. Во втором способе обрабатываемый документ включается в преобразование как пользовательский элемент верхнего уровня и обрабатывается при помощи функции document('')
с пустым строковым параметром.
Включение преобразования в документ
Корневой элемент преобразования xsl:stylesheet
может быть включен в преобразуемый документ со всеми дочерними элементами верхнего уровня и так далее. Для того чтобы использовать это преобразование, псевдоатрибут href
инструкции по обработке xml- stylesheet
должен указывать на идентификатор элемента xsl:stylesheet
, определенный в его атрибуте id
.
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='#transform'?>
<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>
<body title='Main page'>
Main content
</body>
Поскольку элемент xsl:stylesheet
включен в преобразуемый документ, он также подвергнется преобразованию. Для того чтобы избежать этого, в преобразование включается шаблонное правило, которое указывает, что элементы xsl:stylesheet
следует игнорировать:
<xsl:template match='xsl:stylesheet'/>
К сожалению, приходится констатировать тот факт, что описанную возможность (хотя она и включена в спецификацию языка XSLT) поддерживают очень немногие процессоры и поэтому пока что на нее не следует полагаться.