XSLT
Шрифт:
Образцы выбора (match pattern) являются подмножеством полного языка XPath, их можно использовать в элементах
<xsl:template
>, <xsl:key>
и <xsl:number>
. В частности, в образец можно установить атрибут match у <xsl:template>
и <xsl:key>
, и атрибуты count
и from
элемента <xsl:number>
. В следующем списке приведен ряд примеров образцов выбора, много других примеров будет показано в главе 4 при подробном обсуждении использования XPath для выбора
• "
/
" выбирает корневой узел; • "
*
" выбирает элементы узлов (но не всех узлов, как зачастую ошибочно полагают); • "
PLANET
" выбирает элементы <PLANET>
; • "
PLANET/MASS
" выбирает все элементы <MASS>
, дочерние для элемента <PLANET>
; • "
//PLANET
" выбирает все элементы <PLANET>
, производные от корневого узла; • "
.
" выбирает текущий узел (технически это не образец выбора, а выражение XPath, как мы увидим в главе 7). Образцы можно также использовать в атрибуте
select
элементов <xsl:apply-templates>
, <xsl:value-of>
, <xsl:for-each>
, <xsl:copy-of>
и <xsl:sort>
; фактически атрибут select
этих элементов может содержать полные выражения XPath, а не только образцы выбора. Атрибут select
элемента <xsl:value-of>
определяет дочерний узел, значение которого нужно получить: <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>
Теперь пора воспользоваться атрибутом
select
элемента <xsl:apply-templates>
, поскольку это даст нам возможность указать, какой шаблон использовать и когда. Выбор применяемого шаблона
Вплоть до нынешнего момента я использовал только версию элемента
<xsl:apply-templates>
по умолчанию, как, например: <TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsl:apply-templates/>
</TABLE>
Простое использование только
<xsl:apply-templates/>
указывает процессору XSLT осуществлять поиск всех шаблонов, выбирающих дочерние узлы контекстного узла, — это использование
по умолчанию. Однако иногда это не лучший вариант, поскольку может потребоваться применять шаблоны в определенном порядке или иным образом выбрать применяемые шаблоны (последнее можно сделать при помощи атрибута select
элемента <xsl:apply-templates/>
). Например, до сих пор мы только получали значение каждого элемента
<MASS>
, <DAY>
и <RADIUS>
при помощи <xsl:value-of>
: <?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
</Н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>
Здесь только извлекается «сырое» строковое значение каждого узла, которое помещается в HTML-таблицу. Однако может потребоваться дополнительная обработка каждого элемента — например, получить также значения атрибутов UNITS каждого элемента и отобразить их:
<?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>
Поделиться с друзьями: