<xsl:template match='PLANET'>
<xsl:text disable-output- escaping='yes'><</xsl:text>
<xsl:value-of select='@NAME'/>
<xsl:text disable-output- escaping='yes'>></xsl:text>
<xsl:apply-templates/>
<xsl:text disable-output- escaping='yes'></</xsl:text>
<xsl:value-of select='@NAME'/>
<xsl:text disable-output- escaping='yes'>></xsl:text>
</xsl:template>
</xsl:stylesheet>
Но это грубый способ, при котором разметка рассматривается как простой текст. С другой стороны, зная название планеты, я могу создать новый элемент при помощи <xsl:element> (листинг 6.6), получив название новой планеты из атрибута NAME
следующим образом.
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml'/>
<xsl:template match='@*|node()'>
<xsl:copy>
<xsl:apply-templates select='@*|node()'/>
</xsl:copy>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:element name='{@NAME}'>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Этот способ намного чище и проще. Ниже показан результат, в котором на этапе выполнения созданы новые элементы с именами различных планет:
<?xml version='1.0' encoding='UTF-8'/>
<?xml-stylesheet type='text/xml' href='planets.xsl'?>
<PLANETS>
<Mercury>
<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 перигелии-- >
</Mercury>
<Venus>
<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><!--B перигелии-- >
</Venus>
<Earth>
<MASS UNITS='(Earth = 1)'>1</MASS>
<DAY UNITS='days'>1</DAY>
<RADIUS UNITS='miles'>2107</RADIUS>
<DENSITY UNITS='(Earth = 1)'>1</DENSITY>
<DISTANCE UNITS='million miles'>128.4</DISTANCE><!--B перигелии-- >
</Earth>
</PLANETS>
Таким способом можно создавать новые элементы и задавать им имя во время преобразования XSLT.
Элемент <xsl:attribute>: создание новых атрибутов
Аналогично тому, как вы можете создавать новые элементы при помощи <xsl:element>
и устанавливать имя и содержимое элемента на этапе выполнения, при помощи элемента <xsl:attribute>
это можно делать для атрибутов.
У элемента два атрибута:
• name
(обязательный). Имя нового атрибута. Принимает значение шаблона значений атрибута, возвращающего QName
;
• namespace
(необязательный). Пространство имен нового атрибута. Устанавливается в URI.
Этот элемент содержит в себе тело шаблона, которое устанавливает значение атрибута.
В листинге 6.7 я создаю новые элементы <PLANET>
с атрибутами, которые соответствуют различным названиям планет (значения берутся из атрибута COLOR
исходных элементов <PLANET>
).
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='PLANETS'>
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select='PLANET'/>
</BODY>
</HTML>