Книга: Технология 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()">
  <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 будет назначено псевдонимом пространству имен а и наоборот.

Оглавление книги


Генерация: 1.545. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз