<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>

 </axsl:template>

 <axsl:template match='c'>

  <axsl:element name='C'>

   <axsl:apply-templates/>

  </axsl:element>

 </axsl:template>

 <axsl:template match='@*|node()'>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату