<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>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату