Элемент 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 будет назначено псевдонимом пространству имен а и наоборот.