Re: [docbook-apps] Duplicate IDs mess up FO TOC

From
Bob Stayton <>
Date
2008-04-02T15:24:34+00:00
ID
DE3D3E29CB674E80A97C7B37BB3153E9@sheeta
Thread
Re: [docbook-apps] Duplicate IDs mess up FO TOC
Thanks, I'll fix the example.

 

Bob Stayton
Sagehill Enterprises


 

 

  
----- Original Message ----- 

  
From: 
  Mimil Mimil 
  

  
To: Bob Stayton 

  
Cc:  ;  
  

  
Sent: Wednesday, April 02, 2008 5:49 
  AM

  
Subject: Re: [docbook-apps] Duplicate IDs 
  mess up FO TOC

  

Hello Bob,

I think I discovered a little bug in the XML 
  snippet you made. On the test dealing with @xml:id you made a concat with @id 
  instead of @xml:id

 <xsl:when test="$object/@xml:id and $preceding.xid != 
  0">
    <xsl:value-of select="concat($object/@xml:id, 
  $preceding.xid)"/>
  
  </xsl:when>

Regards,
Mimil

  
On Wed, Jan 17, 2007 at 7:17 PM, Bob Stayton <> wrote:

  Here 
    is a solution that will appear in the forthcoming Fourth Edition of my book 
    (no release date yet).

The object.id template is used to generate the output id 
    attribute as well as the link for any element.  As long as it produces 
    consistent output for the same element, your links should work.

In 
    this customization, it counts the number of preceding elements with the same 
    id.  If the count is greater than zero, then it appends the count to 
    the id value.  It works with both @id and @xml:id for db5 
    documents.

<xsl:template name="object.id">
 <xsl:param name="object" 
    select="."/>

 <xsl:variable name="id" 
    select="@id"/>
 <xsl:variable name="xid" 
    select="@xml:id"/>

 <xsl:variable name="preceding.id"
    
      select="count(preceding::*[@id = 
    $id])"/>

 <xsl:variable name="preceding.xid"
  
        select="count(preceding::*[@xml:id = 
    $xid])"/>

 <xsl:choose>
  <xsl:when 
    test="$object/@id and $preceding.id != 0">
    <xsl:value-of 
    select="concat($object/@id, $preceding.id)"/>
  </xsl:when>
  
    <xsl:when test="$object/@id">
    <xsl:value-of 
    select="$object/@id"/>
  </xsl:when>
  <xsl:when 
    test="$object/@xml:id and $preceding.xid != 0">
    
    <xsl:value-of select="concat($object/@id, $preceding.xid)"/>
  
    </xsl:when>
  <xsl:when 
    test="$object/@xml:id">
    <xsl:value-of 
    select="$object/@xml:id"/>
  </xsl:when>
  
    <xsl:otherwise>
    <xsl:value-of 
    select="generate-id($object)"/>
  
    </xsl:otherwise>
 </xsl:choose>
</xsl:template>

Bob 
    Stayton
Sagehill Enterprises
DocBook Consulting


----- Original Message ----- 
    From: "Claus Rasmussen" <>
To: <>
Sent: Wednesday, 
    January 17, 2007 7:02 AM
Subject: [docbook-apps] Duplicate IDs mess up FO 
    TOC
    

    

    

    Hi 
      folks,

I'm reusing quite a few sections using xincludes and my 
      table of contents
gets confused when generating PDF output: It can not 
      correctly determine the
page number of all sections since multiple 
      sections have the same ID (the
ones that are reused).

I'm fully 
      aware that duplicate ID attributes in my aggregated document makes
it 
      invalid, but ignoring that for a while, would any of you know how 
      to
solve this problem and get a nice printed TOC?

Of course 
      there's the laborous approach suggested by Bob
(http://www.sagehill.net/docbookxsl/DuplicateIDs.html) 
      but that's not really
feasible in this 
      case.

Best,
Claus

-- 
http://techwriter.dk/

---------------------------------------------------------------------
To 
      unsubscribe, e-mail: 
For 
      additional commands, e-mail: 

---------------------------------------------------------------------
To 
    unsubscribe, e-mail: 
For 
    additional commands, e-mail: