Книга: XSLT

Создание уникальных идентификаторов при помощи generate-id

Создание уникальных идентификаторов при помощи generate-id

При существенном изменении структуры документов важно рассмотреть еще одну тему: как в результирующих документах создавать идентификаторы элементов для обращения к ним при необходимости. Представьте, например, что вам нужно при помощи таблицы стилей добавить в документ оглавление, записи в котором будут представлять собой гиперссылки, так чтобы пользователь по щелчку на них сразу переходил к нужному разделу. В этом случае потребуется какой-то способ идентификации элементов в результирующем документе, в чем поможет функция generate-id.

В следующем примере я добавляю составленное из гиперссылок оглавление в planets.html. Для создания оглавления я прохожу в цикле по всем планетам при помощи элемента <xsl:for-each>. На каждом шаге цикла я создаю гиперссылку и при помощи шаблона значений атрибута создаю атрибут HREF, который устанавливается в уникальный идентификатор для рассматриваемой планеты. Заметьте, что, несмотря на свое имя, функция generate-id создает только строковый идентификатор элемента, она не создает атрибуты ID:

<?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>
    <xsl:for-each select="PLANET">
     <H2><A HREF="#{generate-id()}">
      <xsl:value-of select="NAME"/>
     </A></H2>
     <P/>
    </xsl:for-each>
    .
    .
    .

Эта таблица стилей (листинг 6.12) генерирует для каждой планеты идентификатор и создает требуемые гиперссылки. Функция generate-id не только создает для элемента новый идентификатор, но и возвращает его при последующем применении generate-id к этому элементу. В данном случае это удобно, поскольку таким образом я могу создать закладки гиперссылки в HTML-таблице данных планет, установить по очереди атрибут <NAME> закладки в идентификатор для каждого элемента <PLANET> — так, чтобы он стал гиперссылкой-назначением.

Листинг 6.12. Применение функции generate-id

<?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>
    <xsl:for-each select="PLANET">
     <H2><A HREF="#{geherate-id()}" >
      <xsl:value-of select="NAME"/>
     </A></H2>
     <P/>
    </xsl:for-each>
    <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>
 <xsl:template match="PLANET">
  <TR>
   <TD><A NAME="{generate-id(.)}">
    <xsl:value-of select="NAME"/>
   </A></TD>
   <TD><xsl:apply-templates select="MASS"/></TD>
   <TD><xsl:apply-templates select="RADIUS"/></TD>
   <TD><xsl:apply-templates select="DAY"/></TD>
  </TR>
 </xsl:template>
 <xsl:template match="MASS">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@UNITS"/>
 </xsl:template>
 <xsl:template match="RADIUS">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@UNITS"/>
 </xsl:template>
 <xsl:template match="DAY">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@UNITS"/>
 </xsl:template>
</xsl:stylesheet>

Вот как это делается: сейчас я создал гиперссылки с атрибутом HREF, значение которого равно идентификатору элемента <PLANET>; при помощи этого же идентификатора я сделал каждый элемент <PLANET> назначением гиперссылки. Когда пользователь щелкает на гиперссылку в оглавлении, браузер прокручивает данные до соответствующей записи планеты в HTML-таблице. (Заметьте, что для того чтобы большинство браузеров осуществляли прокрутку, HTML-таблица должна быть вне пределов экрана.) Каждый процессор XSLT создает свои собственные идентификаторы; ниже приведен результат для процессора Xalan:

<HTML>
 <HEAD>
  <TITLE>
   The Planets Table
  </TITLE>
 </HEAD>
 <BODY>
  <H1>
   The Planets Table
  </H1>
  <H2>
   <A href="#N5">Mercury</A>
  </H2>
  <Р></Р>
  <Н2>
   <A href="#N20">Venus</A>
  </H2>
  <P></P>
  <H2>
   <A href="#N3B">Earth</A>
  </H2>
  <Р></Р>
  <TABLE BORDER="2">
   <TR>
    <TD>Name</TD>
    <TD>Mass</TD>
    <TD>Radius</TD>
    <TD>Day</TD>
   </TR>
   <TR>
    <TD><A NAME="N5">Mercury</A></TD>
    <TD>.0553 (Earth = 1)</TD>
    <TD>1516 miles</TD>
    <TD>58.65 days</TD>
   </TR>
   <TR>
    <TD><A NAME="N20">Venus</A></TD>
    <TD>.815 (Earth = 1)</TD>
    <TD>3716 miles</TD>
    <TD>116.75 days</TD>
   </TR>
   <TR>
    <TD><A NAME="N3B">Earth</A></TD>
    <TD>1 (Earth = 1)</TD>
    <TD>2107 miles</TD>
    <TD>1 days</TD>
   </TR>
  </TABLE>
 </BODY>
</HTML>

Результат показан на рис. 6.3 (в том числе — оглавление из гиперссылок). Пользователю достаточно щелкнуть на гиперссылке к соответствующей записи в таблице.


Рис. 6.3. Использование сгенерированных идентификаторов в гиперссылках

Оглавление книги


Генерация: 0.515. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз