XSLT
Шрифт:
Обработка дочерних узлов
Элемент
<xsl:apply-templates>
дает указание процессору XSLT обрабатывать все совпадающие шаблоны для дочерних узлов контекстного узла. Элемент <xsl:apply-templates>
дает возможность явно указать, когда следует закончить обработку дочерних узлов, а это имеет решающее значение при вставке их данных в нужное место в HTML-таблице. Один важный момент часто вызывает затруднения: элемент
<xsl:apply-templates>
по умолчанию применяет шаблоны только к дочерним узлам контекстного или выбранного узла или набора узлов. Это выглядит довольно безобидно, но многие люди забывают о том, что атрибуты не
В следующем примере мы поместим элемент
<xsl:apply-templates>
туда, куда нам требуется вставить данные из элементов <PLANET>
в таблицу HTML. Я также добавил новый шаблон для обработки элементов <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>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
</H1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsl:apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="PLANET">
.
.
.
</xsl:template>
</xsl:stylesheet>
В новом шаблоне, обрабатывающем элементы
<PLANET>
, я должен извлечь данные из каждого элемента <PLANET>
, то есть восстановить значения в дочерних элементах элемента <PLANET>
, таких как <MASS>
, <DAY>
и т.д.: <?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="#"?>
<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><!--B перигелии-->
</PLANET>
.
.
.
Это
можно сделать при помощи элемента<xsl:value-of>
. Доступ к значениям узлов
Элемент
<xsl:value-of>
записывает в результирующий документ строковое значение выражения; в частности, с его помощью можно возвратить значение узла, которым для элемента будет заключенный в элемент текст. Атрибуту выбора элемента <xsl:value-of>
можно присвоить выражение XPath, задающее узел или набор узлов. В шаблоне, задающем элементы <PLANET>
, обратиться к дочернему элементу <MASS>
можно при помощи выражения XPath "child::MASS
". Как мы увидим в главе 4, выражения XPath можно писать разными способами: например, вместо "child::MASS
" можно просто написать "MASS
". Таким образом, получить данные дочерних элементов, таких как <MASS>
, <DAY>
и т.д., можно следующим способом (листинг 3.1). Листинг 3.1. Полная версия planets.xsl
<?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>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<Н1>
The Planets Table
</Н1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsl:apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:value-of select="MASS"/></TD>
<TD><xsl:value-of select="RADIUS"/></TD>
<TD><xsl:value-of select="DAY"/></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
Создание образцов выбора
Как вы могли ожидать, исходя из того, что "
child::MASS
" можно представить в виде "MASS
" и применения шаблонов, таких как "/
", "/PLANETS
" и т.д., вплотную познакомиться с созданием образцов выбора не так-то просто — этому посвящена вся глава 4.
Поделиться с друзьями: