<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<xsclass="underline" apply-templates select="PLANET"/>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<xsclass="underline" text disable-output-escaping="yes">
<PLANET/>
</xsclass="underline" text>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Результат следующий:
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<PLANET/>
<PLANET/>
<PLANET/>
</BODY>
</HTML>
Разумеется, не обязательно выводить <PLANET/> при помощи <xsclass="underline" text>: этот элемент можно было поместить непосредственно в элемент буквального результата. Но что делать в тех случаях, когда процессор XSLT не сможет распознать нужный нам в выходном документе элемент как фактический элемент? Например, в преобразованных документах XHTML вам потребуется <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">, но процессор XSLT сочтет, что это не хорошо сформированный XML. Как поместить этот элемент в выходные данные?
Можно попробовать поместить этот элемент в раздел <!CDATA[ ]>, как мы увидим в главе 6, и попытаться трактовать его как простые символьные данные, но процессоры XSLT все равно заменят < на <, а > на >.
Правильный способ добавить в вывод элемент <!DOCTYPE> — использовать атрибут doctype-public элемента <xsclass="underline" output>, как мы увидим в главе 6, но в качестве демонстрации для этих целей здесь я отключу вывод ESC-последовательностей в элементе <xsclass="underline" text> (хотя этот способ не рекомендован для создания элементов <!DOCTYPE>). Вот как это выглядит:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" output method="xml"/>
<xsclass="underline" template match="/PLANETS">
<xsclass="underline" text disab1e-output-escaping="yes">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
</xsclass="underline" text>
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
</H1>
<TABLE BORDER="2">
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
<xsclass="underline" apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<TR>
<TD><xsclass="underline" value-of select="NAME"/></TD>
<TD><xsclass="underline" apply-templates select="MASS"/></TD>
<TD><xsclass="underline" apply-templates select="RADIUS"/></TD>
<TD><xsclass="underline" apply-templates select="DAY"/></TD>
</TR>
</xsclass="underline" template>
<xsclass="underline" template match="MASS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" text> </xsclass="underline" text>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
<xsclass="underline" template match="RADIUS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" text> </xsclass="underline" text>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
<xsclass="underline" template match="DAY">
<xsclass="underline" value-of select="."/>
<xsclass="underline" text> </xsclass="underline" text>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
</xsclass="underline" 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
.
.
.
Далее в книге будут приведены другие примеры использования <xsclass="underline" text>, в том числе — при обсуждении символов-разделителей далее в этой главе.
Написание значений атрибутов
В XSLT есть несколько способов написать значения атрибутов в выходные документы, и наиболее мощный — это создать атрибуты с нуля при помощи элемента <xsclass="underline" 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> и попытался сделать их значениями атрибутов:
<xsclass="underline" template match="PLANET">
<PLANET NAME="<xsclass="underline" value-of select="NAME"/>"
MASS="<xsclass="underline" value-of select="MASS"/>"
DAY="<xsclass="underline" value-of select="DAY"/>"
/>
Это не будет работать, поскольку нельзя использовать < внутри значений атрибутов, как я сделал в предыдущем примере. В XSLT для этого есть несколько способов. Один из них — использовать шаблоны значений атрибутов.