<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANETS'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match='NAME'>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match='MASS'>
<xsl:copy>
<xsl:value-of select='.'/>
<xsl:value-of select='@UNITS'/>
</xsl:copy>
</xsl:template>
<xsl:template match='RADIUS'>
</xsl:template>
<xsl:template match='DAY'>
</xsl:template>
<xsl:template match='DENSITY'>
</xsl:template>
<xsl:template match='DISTANCE'>
</xsl:template>
</xsl:stylesheet>
А вот результирующий документ (отметьте, что я сохранил только элементы <NAME>
и <MASS>
):
<?xml version='1.0' encoding='UTF-8'?>
<PLANET>
<NAME>Mercury</NAME>
<MASS>.0553(Earth = 1)</MASS>
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<MASS>.815(Earth = 1)</MASS>
</PLANET>
<PLANET>
<NAME>Earth</NAME>
<MASS>1(Earth = 1)</MASS>
</PLANET>
Таким способом можно фильтровать XML-документы, создавая новые XML-документы только с требуемыми данными.
Разрешение конфликтов шаблонов
Еще одним важным аспектом работы с шаблонами является разрешение конфликтов. Если двум шаблонам удовлетворяют один и тот же узел или набор узлов, для определения применяемого шаблона XSLT учитывает их приоритет.
У каждого шаблона есть приоритет по умолчанию, основанный на значении атрибута select
. Как правило, чем более сужающим является правило выбора или выражение (например, 'PLANET
' и '*
'), тем выше его приоритет. В главе 4 мы рассмотрим, как процессор определяет приоритеты и как он работает с шаблонами, имеющими одинаковый приоритет.
Приоритет шаблона можно установить при помощи атрибута priority
. В приведенном ниже листинге 3.8 правило, созданное элементом <xsl:template priority='1'/>
, имеет меньший приоритет, чем правило, созданное элементом <xsl:template priority='2'/>
.
<?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>