<TD><xsl:apply-templates select='MASS'/></TD>
<TD><xsl:apply-templates select='RADIUS'/></TD>
<TD><xsl:apply-templates select='DAY'/></TD>
</TR>
</xsl:template>
<xsl:template match='MASS'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
</xsl:template>
<xsl:template match='RADIUS'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
</xsl:template>
<xsl:template match='DAY'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
</xsl:template>
</xsl:stylesheet>
А вот результат:
<?xml version='1.0' encoding-'UTF-8'?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'>
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
.
.
.
Далее в книге будут приведены другие примеры использования <xsl:text>
, в том числе — при обсуждении символов-разделителей далее в этой главе.
Написание значений атрибутов
В XSLT есть несколько способов написать значения атрибутов в выходные документы, и наиболее мощный — это создать атрибуты с нуля при помощи элемента <xsl:attribute>
, как мы увидим в главе 6.
Однако можно также во многих случаях использовать шаблоны значений атрибутов, с которыми мы познакомимся в этой главе.
Предположим, например, что нам требуется преобразовать текст в таких элементах, как <MASS>
, <DAY>
и <NAME>
, в атрибуты элементов <PLANET>
, преобразуя planets.xml
в следующий вид:
<?xml version='1.0' encoding='UTF-8'?>
<PLANETS>
<PLANET DAY='58.65 days' RADIUS='1516 miles'
MASS='.0553 (Earth = 1)' NAME='Mercury'/>
<PLANET DAY='116.75 days' RADIUS='3716 miles'
MASS='.815 (Earth = 1)' NAME='Venus'/>
<PLANET DAY='1 days' RADIUS='2107 miles'
MASS='1 (Earth = 1)' NAME='Earth'/>
</PLANETS>
Чтобы создать преобразование, нельзя просто использовать следующее выражение, в котором я взял значения элементов <NAME>
, <MASS>
и <DAY>
и попытался сделать их значениями атрибутов:
<xsl:template match='PLANET'>
<PLANET NAME='<xsl:value-of select='NAME'/>'
MASS='<xsl:value-of select='MASS'/>'
DAY='<xsl:value-of select='DAY'/>'
/>
Это не будет работать, поскольку нельзя использовать < внутри значений атрибутов, как я сделал в предыдущем примере. В XSLT для этого есть несколько способов. Один из них — использовать шаблоны значений атрибутов.
Шаблоны значений атрибутов
Шаблон имени значения атрибута не имеет ничего общего с теми шаблонами, с которыми мы до сих пор работали, — то есть с шаблонами для создания правил таблицы стилей. Напротив, применение шаблона значения атрибута (attribute value template) означает лишь, что значение атрибута может быть установлено во время выполнения.
В этом случае атрибут можно установить в значение выражения XPath (более подробно эта тема изучается в главе 4), если заключить выражение в фигурные скобки. Например, чтобы установить атрибут NAME
в строковое значение элемента <DESCRIPTION>
, дочернего элемента контекстного узла, это значение можно присвоить следующим образом: NAME= {DESCRIPTION}
.
В листинге 3.5 приведен правильный код XSLT, в котором значения элементов <NAME>
, <MASS>
, <RADIUS>
и <DAY>
присваиваются атрибутам элемента <PLANET>
с теми же именами.
<?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='PLANETS'>