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

ЖАНРЫ

Технология XSLT

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

Шрифт:

 </axsl:template>

 <axsl:template match="c">

<axsl:element name="C">

<axsl:apply-templates/>

</axsl:element>

 </axsl:template>

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

<axsl:copy>

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

</axsl:copy>

 </axsl:template>

</axsl:stylesheet>

В

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

Атрибуты

stylesheet-prefix
и
result-prefix
элемента
xsl:namespace-alias
могут иметь значения
"#default"
. Определение вида

<xsl:namespace-alias

 stylesheet-prefix="a"

 result-prefix="#default"/>

означает, что элементы, принадлежащие в преобразовании пространству имен

а
, в выходящем документе должны принадлежать пространству имен по умолчанию. Определение вида

<xsl:namespace-alias

 stylesheet-prefix="#default"

 result-prefix="a"/>

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

а
.

Пример
Листинг 8.17. Преобразование

<xsl:stylesheet

 version="1.0"

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

 xmlns:a="urn:a"

 xmlns="urn:b">

 <xsl:namespace-alias

stylesheet-prefix="#default"

result-prefix="a"/>

 <xsl:namespace-alias

stylesheet-prefix="a"

result-prefix="#default"/>

 <xsl:template match="root">

<result>

<a:element/>

</result>

 </xsl:template>

</xsl:stylesheet>

Листинг 8.18. Выходящий документ

<result xmlns="urn:a" xmlns:a="urn:b">

 <a:element/>

</result>

Результатом этого преобразования является то, что пространство имен с URI

"urn:а"
стало пространством имен по умолчанию, а пространство имен с URI
"urn:b"
изменило префикс на
а
.

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

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

Пример

Если преобразование

a.xsl
содержит определение

<xsl:namespace-alias

 stylesheet-prefix="x"

 result-prefix="a"/>

а

преобразование
b.xsl
— определение

<xsl:namespace-alias

 stylesheet-prefix="x"

 result-prefix="b"/>

где в обоих преобразованиях префикс

x
представляет одно пространство имен, а пространства имен
a
и
b
— разные, то преобразование
a.xsl
не сможет включать преобразование
b.xsl
и наоборот, потому что они будут иметь одинаковый порядок импорта и содержать элементы
xsl:namespace-alias
, назначающие разным пространствам имен одинаковые псевдонимы. В одном преобразовании такие псевдонимы также не имеют права встречаться. Если же подобное все же случилось, процессор может сигнализировать ошибку или использовать определение, которое было дано в преобразовании последним.

Совсем иначе обстоит дело с импортированием. При импортировании определения старших в порядке импорта преобразований могут переопределять определения младших преобразований. Таким образом, если преобразование

a.xsl
будет импортировать преобразование
b.xsl
, пространство имен
x
будет назначено псевдонимом пространству имен
а
и наоборот.

Ключи

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

Листинг 8.19. Входящий документ

<items>

 <item source="a" name="A"/>

 <item source="b" name="B"/>

 <item source="a" name="C"/>

 <item source="c" name="D"/>

 <item source="b" name="E"/>

 <item source="b" name="F"/>

 <item source="c" name="G"/>

 <item source="a" name="H"/>

</items>

Пусть входящий документ представляет собой список объектов (элементов

item
), каждый из которых имеет имя (атрибут
name
) и источник (атрибут
source
). Требуется сгруппировать объекты по своим источникам и получить документ приблизительно следующего вида.

Листинг 8.20. Требуемый результат

<sources>

 <source name="a">

<item source="a" name="A"/>

<item source="a" name="C"/>

<item source="a" name="H"/>

 </source>

 <source name="b">

<item source="b" name="B"/>

<item source="b" name="E"/>

<item source="b" name="F"/>

 </source>

 <source name="c">

<item source="c" name="D"/>

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