<PLANET number='2' total='3'>
<NAME>Venus</NAME>
<MASS>.815</MASS>
<DAY>116.75</DAY>
<RADIUS>3716</RADIUS>
<DENSITY>.943</DENSITY>
<DISTANCE>66.8</DISTANCE>
</PLANET>
<PLANET number='3' total='3'>
<NAME>Earth</NAME>
<MASS>1</MASS>
<DAY>1</DAY>
<RADIUS>2107</RADIUS>
<DENSITY>1</DENSITY>
<DISTANCE>128.4</DISTANCE>
</PLANET>
</PLANETS>
id()
Функция id возвращает набор узлов, в котором все узлы имеют такой же ID, как и переданный в эту функцию. Функция применяется следующим образом:
node-set id(id-value)
В функцию передается значение ID, и она возвращает набор узлов с узлами, имеющими этот ID. Заметьте, что вы можете задать несколько ID, разделенных символами-разделителями, и функция вернет набор узлов с элементами, обладающими этими ID.
Следующее правило-пример выбирает текст всех элементов с ID «favorite»:
<xsl:template match = 'id('favorite')'>
<H3><xsl:value-of select='.'/></H3>
</xsl:template>
Отметьте также, что вы должны объявлять значения ID как в DTD или схеме. Объявление DTD для planets.xml
, объявляющее ID с именем id
и присваивающее ему значение «favorite», может выглядеть так:
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='stylesheet.xsl'?>
<!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, потому что они не читают объявления DTD и схему XML. Это одна из задач, которые призван решить XSLT 2.0 — сделать доступной информацию об идентификаторах.
last()
Функция last
возвращает число узлов в наборе узлов, поэтому ее значение равно позиции последнего узла. Она применяется следующим образом:
number last()
Следующий пример из главы 5 последовательно выводит в результирующий документ имена планет. Однако я хочу, чтобы выводилось не просто «The first three planets are: Mercury Venus Earth» (первые три планеты: Меркурий Венера Земля), a «The first three planets are: Mercury, Venus, and Earth.» Необходимые знаки пунктуации можно добавить, определяя элемент, с которым мы работаем, при помощи функции position и проверяя позицию при помощи <xsl:if>
:
<?xml version='1.0'?>
<xsl stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml'/>
<xsl:template match='PLANETS'>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are:
<xsl:apply-templates select='PLANET'/>
</PLANETS>
</DOCUMENT>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:value-of select='NAME'/>
<xsl:if test='position()!=last()'>, </xsl:if>
<xsl:if test='position()=last()-1'>and </xsl:if>
<xsl:if test='position()=last()'>.</xsl:if>
</xsl:template>
</xsl:stylesheet>