<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='#stylesheet'?>
<!DOCTYPE PLANETS [
<!ELEMENT PLANET (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME,MASS,RADIUS,DAY)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT MASS (#PCDATA)>
<!ELEMENT RADIUS (#PCDATA)>
<!ELEMENT DAY (#PCDATA)>
<!ATTLIST PLANET
id ID #REQUIRED>
]>
<PLANETS>
<PLANET id='favorite'>
<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>
.
.
.
Ряд процессоров XSLT не может осуществлять выбор по ID, потому что они не читают DDS или схему XML. (Возможность доступа к информации ID должна быть включена в XSLT 2.0.) Но есть альтернатива: можно осуществлять выбор по ключу.
ВОЗМОЖНАЯ ПОДДЕРЖКА IDREF
Помимо упрощения работы с ID, в XSLT 2.0 W3C даже рассматривает возможность включения поддержки IDREF. В частности, по заданному ID процессор XSLT может предоставить список всех элементов с атрибутом IDREF или IDREFS, ссылающихся на этот ID. (Заметьте, что сейчас это тоже можно сделать при помощи элемента <xsl:key> и образца 'key()'.)
Выбор по ключу
Ключи дают простой способ идентифицировать элементы; конкретные ключи можно выбрать при помощи образца 'key()
'. Работа с ключами подробно обсуждается в главе 9, но здесь я также приведу небольшой пример.
Для создания ключа служит элемент <xsl:key>
. Это элемент верхнего уровня, поэтому он используется вне шаблонов и как дочерний элемент <xsl:stylesheet>
. В следующем примере я при помощи ключа выбираю планеты, чей атрибут COLOR
(цвет) установлен в 'BLUE
' (голубой), что означает Землю:
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='planets.xsl'?>
<PLANETS>
.
.
.
<PLANET COLOR='BLUE'>
<NAME>Earth</NAME>
<MASS UNITS='(Earth = 1)'>1</MASS>
<DAY UNITS='days'>1</DAY>
<RADIUS UNITS='miles'>2107</RADIUS>
<DENSITY UNITS='(Earth = 1)'>1</DENSITY>
<DISTANCE UNITS='million miles'>128.4</DISTANCE><!--'B перигелии-- >
</PLANET>
</PLANETS>
Теперь я могу создать ключ с именем COLOR
, который выбирает элементы <PLANET>
, проверяя их атрибут COLOR
:
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http.//www.w3.org/1999/XSL/Transform'>
<xsl:key name='COLOR' match='PLANET' use='@COLOR'/>
.
.
.
Теперь при помощи образца 'key()
' можно выбрать элементы <PLANET>
с атрибутом COLOR
со значением 'BLUE
':
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:key name='COLOR' match='PLANET' use='@COLOR'/>
<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 select='key('COLOR', 'BLUE')'/>
</TABLE>
</BODY>