]> granicus.if.org Git - docbook-dsssl/commitdiff
Attempt to fix duplicate-id problem in ToC generation
authorNorman Walsh <ndw@nwalsh.com>
Thu, 28 Mar 2002 12:13:01 +0000 (12:13 +0000)
committerNorman Walsh <ndw@nwalsh.com>
Thu, 28 Mar 2002 12:13:01 +0000 (12:13 +0000)
xsl/fo/autotoc.xsl

index b608039c844d7627d350b9b5d89a3a4aa48adff7..2230aaf7fc1f584e89429897635067f0ada2c539 100644 (file)
 <!-- ==================================================================== -->
 
 <xsl:template name="set.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:variable name="nodes" select="book|setindex"/>
 
   <xsl:if test="$nodes">
     <fo:block id="toc...{$id}"
               xsl:use-attribute-sets="toc.margin.properties">
       <xsl:call-template name="table.of.contents.titlepage"/>
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template name="division.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:variable name="nodes"
                 select="part|reference|preface
                         |chapter|appendix
     <fo:block id="toc...{$id}"
               xsl:use-attribute-sets="toc.margin.properties">
       <xsl:call-template name="table.of.contents.titlepage"/>
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template name="component.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:variable name="nodes" select="section|sect1|refentry
                                      |article|bibliography|glossary
                                      |appendix"/>
@@ -62,7 +90,9 @@
     <fo:block id="toc...{$id}"
               xsl:use-attribute-sets="toc.margin.properties">
       <xsl:call-template name="table.of.contents.titlepage"/>
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 <!-- ==================================================================== -->
 
 <xsl:template match="book|setindex" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
+  <xsl:variable name="id">
+    <xsl:call-template name="object.id"/>
+  </xsl:variable>
+
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
-  <xsl:variable name="nodes" select="glossary|bibliography|preface|chapter|reference|part|article|appendix|index"/>
+  <xsl:variable name="nodes" select="glossary|bibliography|preface|chapter
+                                     |reference|part|article|appendix|index"/>
 
   <xsl:if test="$toc.section.depth &gt; 0 and $nodes">
-    <fo:block start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+    <fo:block id="toc.{$cid}.{$id}"
+              start-indent="{count(ancestor::*)*$toc.indent.width}pt">
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="part" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
+  <xsl:variable name="id">
+    <xsl:call-template name="object.id"/>
+  </xsl:variable>
+
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:variable name="nodes" select="chapter|appendix|preface|reference"/>
 
   <xsl:if test="$toc.section.depth &gt; 0 and $nodes">
-    <fo:block start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+    <fo:block id="toc.{$cid}.{$id}"
+              start-indent="{count(ancestor::*)*$toc.indent.width}pt">
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="reference" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:if test="$toc.section.depth &gt; 0 and refentry">
-    <fo:block id="toc...{$id}"
+    <fo:block id="toc.{$cid}.{$id}"
               start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="refentry" mode="toc"/>
+      <xsl:apply-templates select="refentry" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="refentry" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="toc.line"/>
 </xsl:template>
 
 <xsl:template match="preface|chapter|appendix|article"
               mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:variable name="nodes" select="section|sect1"/>
 
   <xsl:if test="$toc.section.depth &gt; 0 and $nodes">
-    <fo:block id="toc...{$id}"
+    <fo:block id="toc.{$cid}.{$id}"
               start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="sect1" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:if test="$toc.section.depth &gt; 1 and sect2">
-    <fo:block id="toc...{$id}"
+    <fo:block id="toc.{$cid}.{$id}"
               start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="sect2" mode="toc"/>
+      <xsl:apply-templates select="sect2" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="sect2" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:if test="$toc.section.depth &gt; 2 and sect3">
-    <fo:block id="toc...{$id}"
+    <fo:block id="toc.{$cid}.{$id}"
               start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="sect3" mode="toc"/>
+      <xsl:apply-templates select="sect3" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="sect3" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:if test="$toc.section.depth &gt; 3 and sect4">
-    <fo:block id="toc...{$id}"
+    <fo:block id="toc.{$cid}.{$id}"
               start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="sect4" mode="toc"/>
+      <xsl:apply-templates select="sect4" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="sect4" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:call-template name="toc.line"/>
 
   <xsl:if test="$toc.section.depth &gt; 4 and sect5">
-    <fo:block id="toc...{$id}"
+    <fo:block id="toc.{$cid}.{$id}"
               start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-      <xsl:apply-templates select="sect5" mode="toc"/>
+      <xsl:apply-templates select="sect5" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="sect5" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="toc.line"/>
 </xsl:template>
 
 <xsl:template match="section" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
   </xsl:variable>
 
+  <xsl:variable name="cid">
+    <xsl:call-template name="object.id">
+      <xsl:with-param name="object" select="$toc-context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
   <xsl:variable name="depth" select="count(ancestor::section) + 1"/>
 
   <xsl:if test="$toc.section.depth &gt;= $depth">
     <xsl:call-template name="toc.line"/>
 
-    <xsl:if test="$toc.section.depth &gt; $depth">
-      <fo:block id="toc...{$id}"
+    <xsl:if test="$toc.section.depth &gt; $depth and section">
+      <fo:block id="toc.{$cid}.{$id}"
                 start-indent="{count(ancestor::*)*$toc.indent.width}pt">
-        <xsl:apply-templates select="section" mode="toc"/>
+        <xsl:apply-templates select="section" mode="toc">
+          <xsl:with-param name="toc-context" select="$toc-context"/>
+        </xsl:apply-templates>
       </fo:block>
     </xsl:if>
   </xsl:if>
 
 <xsl:template match="bibliography|glossary"
               mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="toc.line"/>
 </xsl:template>
 
 <xsl:template match="index"
               mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:if test="* or $generate.index">
     <xsl:call-template name="toc.line"/>
   </xsl:if>
 <xsl:template name="list.of.titles">
   <xsl:param name="titles" select="'table'"/>
   <xsl:param name="nodes" select=".//table"/>
+  <xsl:param name="toc-context" select="."/>
 
   <xsl:variable name="id">
     <xsl:call-template name="object.id"/>
           <xsl:call-template name="list.of.unknowns.titlepage"/>
         </xsl:otherwise>
       </xsl:choose>
-      <xsl:apply-templates select="$nodes" mode="toc"/>
+      <xsl:apply-templates select="$nodes" mode="toc">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </fo:block>
   </xsl:if>
 </xsl:template>