Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

</xsl:stylesheet>

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

<xsl:template match="replace">

 <xsl:element name="xsl:template">

<xsl:attribute name="match">

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

</xsl:attribute>

<xsl:element name="xsl:element">

<xsl:attribute name="name">

<xsl:value-of select="@with"/>

</xsl:attribute>

<xsl:element name="xsl:apply-templates"/>

</xsl:element>

 </xsl:element>

</xsl:template>

Шаблон

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

<xsl:template match="replace">

 <xsl:template match="{@select}">

<xsl:element name="{@with}">

<xsl:apply-templates/>

</xsl:element>

 </xsl:template>

</xsl:template>

был бы некорректен. По этой причине нам пришлось генерировать все инструкции при помощи

xsl:element
и
xsl:attribute
, что сделало шаблон громоздким и малопонятным.

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

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

xsl:namespace-alias
.

Элемент xsl:namespace-alias

Синтаксическая конструкция этого элемента выглядит следующим образом:

<xsl:namespace-alias

 stylesheet-prefiх="префикс" | "#default"

 result-prefix="префикс" | "#default"/>

Элемент

xsl:namespace-alias
назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, иначе говоря — псевдоним.

Обязательный атрибут

result-prefix
указывает, какому пространству имен назначается псевдоним. Обязательный атрибут
stylesheet-prefix
указывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании. Оба атрибута содержат префиксы пространств имен, которые, естественно, должны быть ранее объявлены в преобразовании.

Пример

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

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

Листинг 8.15. Преобразование, использующее псевдонимы пространств имен

<xsl:stylesheet

 version="1.0"

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

 xmlns:axsl="http://www.w3.org/1999/XSL/Transform/Alias">

 <xsl:namespace-alias

stylesheet-prefix="axsl"

result-prefix="xsl"/>

 <xsl:template match="replace">

<axsl:template match="{@select}">

<axsl:element name="{@with}">

<axsl:apply-templates/>

</axsl:element>

</axsl:template>

 </xsl:template>

 <xsl:template match="remove">

<axsl:template match="{@select}"/>

 </xsl:template>

 <xsl:template match="transform">

<axsl:stylesheet version="1.0">

<xsl:apply-templates/>

<axsl:template match="@*|node">

<axsl:copy>

<axsl:apply-templates select="@*|node"/>

</axsl:copy>

</axsl:template>

</axsl:stylesheet>

 </xsl:template>

</xsl:stylesheet>

В этом преобразовании элемент

xsl:namespace-alias
указывает на то, что все элементы, принадлежащие в преобразовании пространству имен с URI

http://www.w3.org/1999/XSL/Transform/Alias

в выходящем документе должны принадлежать пространству имен с URI

http://www.w3.org/1999/XSL/Transform

то есть пространству имен XSLT.

Результатом применения этого преобразования к документу из листинга 8.13 будет следующий документ.

Листинг 8.16. Выходящее преобразование

<axsl:stylesheet

 version="1.0"

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

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

 <axsl:template match="a"/>

 <axsl:template match="b">

<axsl:element name="B">

<axsl:apply-templates/>

</axsl:element>

Поделиться с друзьями: