<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.
Образцы выбора (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>