определенные пользователем или производителем элементы, не являющиеся элементами верхнего уровня. Они должны принадлежать к пространству имен, которое было определено как пространство имен расширений.
Для определения пространства имен расширений применяется атрибут extension-element- prefixes
в элементе <xsl:stylesheet>
, или атрибут xsl:extension-element- prefixes
в элементе буквального результата или элементе расширения.
Ниже приведен пример. Xalan позволяет вам создать несколько выходных документов при помощи своего элемента расширения <redirect:write>
. Для того чтобы применить этот элемент, я могу добавить в planets.xml
элементу документа атрибут file
, задав имя файла, в который будет отправлен вывод, как redirected.xml
:
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='planets.xsl'?>
<PLANETS file='redirected.xml'>
<PLANET>
<NAME>Mercury</NAME>
<MASS UNITS='(Earth = 1)'>.0553</MASS>
<DAY UNITS='days'>58.65</DAY>
<RADIUS UNITS='miles'>1516</RADIUS>
<DENSITY UNITS='(Earth = 1)'>.983</DENSITY>
<DISTANCE UNITS='million miles'>43.4</DISTANCE><!--B перигелии-- >
</PLANET>
.
.
.
Теперь в таблице стилей XSLT, которую я назвал redirect.xsl
, я определяю пространство имен «redirect
» так, чтобы оно соответствовало классу Java, который поддерживает ее в Xalan: org.apache.xalan.lib.Redirect
. Я также устанавливаю атрибут extension-element-prefixes
элемента <xsl:stylesheet>
в значение пространства имен «redirect
»:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version='1.0'
xmlns:lxslt=http://xml.apache.org/xslt'
xmlns:redirect='org.apache.xalan.lib.Redirect'
extension-element-prefixes='redirect'>
.
.
.
В этот момент мне ничто не мешает применить элемент расширения <redirect:write>
для записи вывода в новый файл (в отличие от указанного в командной строке). Например, для того, чтобы отправить в другой файл отформатированное содержимое элемента <PLANET>
, я могу получить имя создаваемого файла из атрибута file
элемента <PLANETS>
и записать данные в этот новый файл:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version='1.0'
xmlns:lxslt='http://xml.apache.org/xslt'
xmlns:redirect='org.apache.xalan.lib.Redirect'
extension-element-prefixes='redirect'>
<lxslt:component prefix='redirect' elements='write open close' functions=''>
<lxslt:script lang='javaclass' src='org.apache.xalan.lib.Redirect'/>
</lxslt:component>
<xsl:output method='xml'/>
<xsl:template match='/'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANETS'>
<redirect:write select='@file'>
<PLANETS>
<xsl:apply-templates/>
</PLANETS>
</redirect:write>
</xsl:template>
<xsl:template match='@*|node()'>
<xsl:copy>
<xsl:apply-templates select='@*|node()'/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Операция завершена; вот как это может выглядеть при использовании Xalan в Windows:
C:planets>java org.apache.xalan.xslt.Process -IN planets.xml -XSL redirect.xsl -OUT new.xml
При этом будет создан файл redirected.xml
, который выглядит следующим образом:
<?xml version='1.0' encoding='UTF-8'?>
<PLANETS>
<PLANET>
<NAME>Mercury</NAME>
<MASS UNITS='(Earth = 1)'>.0553</MASS>
<DAY UNITS='days'>58.65</DAY>
<RADIUS UNITS='miles'>1516</RADIUS>
<DENSITY UNITS='(Earth = 1)'>.983</DENSITY>
<DISTANCE UNITS='million miles'>43.4</DISTANCE>
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<MASS UNITS='(Earth = 1)'>.815</MASS>
<DAY UNITS='days'>116.75</DAY>
<RADIUS UNITS='miles'>3716</RADIUS>
<DENSITY UNITS='(Earth = 1)'>.943</DENSITY>
<DISTANCE UNITS='million miles'>66.8</DISTANCE>
</PLANET>
.
.
.