<xsl:template match='text()[starts-with(., 'E')]'>
<xsl:text>(the World)</xsl:text>
</xsl:template>
<xsl:template match='NAME'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='DAY'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
</xsl:template>
</xsl:stylesheet>
А вот результат — заметьте, что заголовок для Земли стал 'Earth (the World)':
<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>
<TR>
<TD>Earth (the World)</TD>
<TD>1 (Earth = 1)</TD>
<TD>2107 miles</TD>
<TD>1 days</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Этот документ показан на рис. 4.2.
Рис. 4.2. Применение текстовых предикатов
Предикаты: фрагменты результирующего дерева
XSLT 1.0 добавляет к поддерживаемым XPath типам данных фрагменты результирующего дерева. Это фрагменты дерева, которые можно присваивать переменным XSLT, они не очень широко распространены. Практически все, что можно с ними сделать, — это вычислить их строковое значение. В рабочем проекте XSLT 1.1 их поддержка была удалена, поэтому, видимо, в XSLT 2.0 их уже не будет.
Сокращенный синтаксис предикатов
Выражения предикатов можно сокращать, опуская 'position()=
'. Например, [position()=3]
становится [3]
, [position()=last()]
становится [last()]
и т.д. С использованием сокращенного синтаксиса применять выражения XPath в предикатах становится существенно проще. Вот ряд примеров:
• PLANET[2]
. Возвращает второго ребенка <PLANET>
контекстного узла;
• PLANET[last()]
. Возвращает последнего ребенка <PLANET>
контекстного узла;
• /PLANETS/PLANET[2]/NAME[1]
. Возвращает первый элемент <NAME>
второго элемента <PLANET>
элемента <PLANETS>
;
• PLANET[5][@UNITS='million miles']
. Возвращает пятого ребенка <PLANET>
контекстного узла, только если у него имеется атрибут UNITS
со значением 'million miles
'. Это выражение можно также написать как PLANET [@UNITS='million miles'][5]
.
На этом мы заканчиваем рассмотрение трех частей образцов шага: осей, условий узлов и предикатов. Это строительные блоки образцов выбора. Лучше всего изучить создание образцов на примере, и многие примеры мы вскоре рассмотрим. Сначала, однако, важно рассмотреть две небольшие темы. Как вы помните из формального определения образцов выбора, можно помимо образцов шага, создавать образцы, выбирающие элементы по идентификатору (ID) или ключу.
Выбор по ID
В дополнение к созданию образцов из образцов шага, задающих ось, условие узла и предикат, можно применять и образец id()
для выбора элементов с определенным значением ID. Для работы с этим образцом необходимо задать элементам атрибут ID, который должен быть объявлен с типом ID, что можно сделать в DTD или схеме документа. В следующем примере правило добавляет текст всех элементов, имеющих ID 'favorite
':
<xsl:template match = 'id('favorite')'>
<H3><xsl:value-of select='.'/></H3>
</xsl:template>
Вот как может выглядеть объявление DTD для planets.xml
, в котором объявляется ID и его значение устанавливается в 'favorite
':