Выбрать главу

 </xsclass="underline" template>

 <xsclass="underline" template match="@*|node()">

  <xsclass="underline" copy>

   <xsclass="underline" apply-templates select="@*|node()"/>

  </xsclass="underline" copy>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

<xsclass="underline" template match="replace">

 <xsclass="underline" element name="xsclass="underline" template">

  <xsclass="underline" attribute name="match">

   <xsclass="underline" value-of select="@select"/>

  </xsclass="underline" attribute>

  <xsclass="underline" element name="xsclass="underline" element">

   <xsclass="underline" attribute name="name">

    <xsclass="underline" value-of select="@with"/>

   </xsclass="underline" attribute>

   <xsclass="underline" element name="xsclass="underline" apply-templates"/>

  </xsclass="underline" element>

 </xsclass="underline" element>

</xsclass="underline" template>

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

<xsclass="underline" template match="replace">

 <xsclass="underline" template match="{@select}">

  <xsclass="underline" element name="{@with}">

   <xsclass="underline" apply-templates/>

  </xsclass="underline" element>

 </xsclass="underline" template>

</xsclass="underline" template>

был бы некорректен. По этой причине нам пришлось генерировать все инструкции при помощи xsclass="underline" element и xsclass="underline" attribute, что сделало шаблон громоздким и малопонятным.

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

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

Элемент xsclass="underline" namespace-alias

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

<xsclass="underline" namespace-alias

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

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

Элемент xsclass="underline" namespace-alias назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, иначе говоря — псевдоним.

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

Пример

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

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

<xsclass="underline" stylesheet

 version="1.0"

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

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

 <xsclass="underline" namespace-alias

  stylesheet-prefix="axsl"

  result-prefix="xsl"/>

 <xsclass="underline" template match="replace">

  <axsclass="underline" template match="{@select}">

   <axsclass="underline" element name="{@with}">

    <axsclass="underline" apply-templates/>

   </axsclass="underline" element>

  </axsclass="underline" template>

 </xsclass="underline" template>

 <xsclass="underline" template match="remove">

  <axsclass="underline" template match="{@select}"/>

 </xsclass="underline" template>

 <xsclass="underline" template match="transform">

  <axsclass="underline" stylesheet version="1.0">

   <xsclass="underline" apply-templates/>

   <axsclass="underline" template match="@*|node()">

    <axsclass="underline" copy>

     <axsclass="underline" apply-templates select="@*|node()"/>

    </axsclass="underline" copy>

   </axsclass="underline" template>

  </axsclass="underline" stylesheet>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

В этом преобразовании элемент xsclass="underline" namespace-alias указывает на то, что все элементы, принадлежащие в преобразовании пространству имен с URI

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

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

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

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

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

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

<axsclass="underline" stylesheet

 version="1.0"

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

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

 <axsclass="underline" template match="a"/>

 <axsclass="underline" template match="b">

  <axsclass="underline" element name="B">

   <axsclass="underline" apply-templates/>

  </axsclass="underline" element>

 </axsclass="underline" template>

 <axsclass="underline" template match="c">

  <axsclass="underline" element name="C">

   <axsclass="underline" apply-templates/>

  </axsclass="underline" element>

 </axsclass="underline" template>

 <axsclass="underline" template match="@*|node()">

  <axsclass="underline" copy>

   <axsclass="underline" apply-templates select="@*|node()"/>

  </axsclass="underline" copy>

 </axsclass="underline" template>

</axsclass="underline" stylesheet>

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

Атрибуты stylesheet-prefix и result-prefix элемента xsclass="underline" namespace-alias могут иметь значения "#default". Определение вида

<xsclass="underline" namespace-alias

 stylesheet-prefix="a"

 result-prefix="#default"/>

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