Gavin wrote:
> Just wondering on the implementation of generate-id when @id are already
> present.
> 
> Example, in sample.xml we have
> 
> <section id="link-class">
> 
> which gives us a generated file with
> 
> <a name="N102CC"></a><a name="link-class"></a>
> 
> Now, I don't see the generated-id as being referenced anywhere, whereas
> 'link-class' is referenced from the toc.
>
> This seems to be the situation for all <section id="..."> , they all get a
> generated id also.
> 
> In document-to-html.xsl we have :-
> 
>   <xsl:template match="section">
> <!-- count the number of section in the ancestor-or-self axis to compute
>          the title element name later on -->
>     <xsl:variable name="sectiondepth"
> select="count(ancestor-or-self::section)"/><a name="{generate-id()}"/>
>     <xsl:apply-templates select="@id"/>
> ...
> 
> which causes the above behaviour.
> 
> So, just wanted to query, should we use the given id and not use generate-id
> unless an id is not given? (as 'id' is not a required attribute of section)
> ? That way we have one named anchor or the other, not both.

The following template is responsible for processing the section tag in [1].

<xsl:template match="section">
  ...
  <a name="{generate-id()}"/> (1)
  <xsl:apply-templates select="@id"/> (2)
  ...
</xsl:template>

It should be safe to remove (1) and replace (2) and other references to @id 
with:

<xsl:call-template name="generate-id"/>

It would be even better to wrap the heading with a div. This way we can easily 
generate something like:

<div id="section-id">
  <a name="section-id"/> 
  <h2>Section Heading</h2>
  ...
</div>

The id attribute on the wrapper div will do what (1) is supposed to do and is 
generally a better solution so we could also remove (1) unless there's a good 
reason not to do so.

-Sina

[1] $FORREST/main/webapp/skins/common/xslt/html/document-to-html.xsl