generate-id()

generate-id()

Функция generate-id дает указание процессору XSLT присвоить узлу идентификатор (который возвращается как строка). Функция применяется следующим образом:

string generate-id(node)

Функции следует передать набор узлов, содержащий только узел, которому нужен идентификатор (все узлы после первого игнорируются); функция возвращает уникальный идентификатор для этого узла. Если передать функции снова этот же узел, она вернет тот же идентификатор. Заметьте, что идентификаторы различаются в зависимости от процессора XSLT.

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

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

    .

    .

    .

Этот код добавляет каждой планете идентификатор и создает нужные гиперссылки. Я могу создать закладки гиперссылки в HTML-таблице данных планет, установив по очереди атрибут <NAME> закладки в идентификатор для каждого элемента <PLANET> так, чтобы он стал гиперссылкой-назначением:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="/PLANETS">

  <HTML>

   .

   .

   .

  </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="DAY">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

</xsl:stylesheet>

Вот и все; сейчас я создал гиперссылки с атрибутом HREF, значение которого равно идентификатору элемента <PLANET>; при помощи же этого идентификатора я сделал каждый элемент <PLANET> назначением гиперссылки.

Когда пользователь щелкает на гиперссылку в оглавлении, браузер прокручивает данные до соответствующей записи планеты в HTML-таблице. Вот как выглядит результирующий документ при использовании процессора Xalan: 

<HTML>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </H1>

  <H2>

   <A href="#N5">Mercury</A>

  </H2>

  <P></P>

  <H2>

   <A href="#N20">Venus</A>

  </H2>

  <P></P>

  <H2>

   <A href="#N3B">Earth</A>

  </H2>

  <P></P>

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