]> granicus.if.org Git - docbook-dsssl/commitdiff
Added XSL-based olink processing.
authorBob Stayton <bobs@sagehill.net>
Thu, 20 Feb 2003 08:47:59 +0000 (08:47 +0000)
committerBob Stayton <bobs@sagehill.net>
Thu, 20 Feb 2003 08:47:59 +0000 (08:47 +0000)
website/xsl/chunk-common.xsl
website/xsl/olink.xsl [new file with mode: 0644]
website/xsl/website-common.xsl
website/xsl/website-targets.xsl [new file with mode: 0644]

index 83b6afc02442a89b2fe3f9ec4d85f7e0c9c310be..d750c058dd5724778c396610e9e112496f73117b 100644 (file)
 <xsl:param name="rebuild-all" select="'0'"/>
 
 <xsl:template match="autolayout">
-  <xsl:apply-templates select="toc|notoc" mode="make"/>
+  <!-- Regenerate olink database? -->
+  <xsl:if test="$collect.xref.targets = 'yes' or
+                $collect.xref.targets = 'only'">
+    <xsl:apply-templates select="." mode="collect.targets"/>
+  </xsl:if>
+
+  <xsl:if test="$collect.xref.targets != 'only'" >
+    <xsl:apply-templates select="toc|notoc" mode="make"/>
+  </xsl:if>
 </xsl:template>
 
 <xsl:template match="toc|tocentry|notoc" mode="make">
   </xsl:choose>
 </xsl:template>
 
+<xsl:template match="autolayout" mode="collect.targets">
+  <xsl:choose>
+    <xsl:when test="$website.database.document = ''">
+      <xsl:message>
+        Must specify a $website.database.document parameter when
+        $collect.xref.targets is set to 'yes' or 'only'.
+        The xref targets were not collected.
+      </xsl:message>
+    </xsl:when> 
+    <xsl:otherwise>
+      <xsl:choose>
+        <xsl:when test="$website.database.document">
+          <xsl:call-template name="write.chunk">
+            <xsl:with-param name="filename"
+                           select="$website.database.document"/>
+            <xsl:with-param name="method" select="'xml'"/>
+            <xsl:with-param name="encoding" select="'utf-8'"/>
+            <xsl:with-param name="omit-xml-declaration" select="'no'"/>
+            <xsl:with-param name="indent" select="'yes'"/>
+            <xsl:with-param name="quiet" select="0"/>
+            <xsl:with-param name="content">
+              <targetset>
+                <xsl:apply-templates select="." mode="olink.mode"/>
+              </targetset>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:when>
+        <xsl:otherwise>
+          <!-- Else write to standard output -->
+          <xsl:apply-templates select="." mode="olink.mode"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
 </xsl:stylesheet>
diff --git a/website/xsl/olink.xsl b/website/xsl/olink.xsl
new file mode 100644 (file)
index 0000000..86d87ac
--- /dev/null
@@ -0,0 +1,433 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="1.0">
+
+<xsl:param name="website.database.document"
+           select="'website.database.xml'"/>
+
+<xsl:template match="olink" name="olink">
+  <xsl:choose>
+    <xsl:when test="@targetdoc != '' or @ targetptr != ''">
+      <xsl:call-template name="olink-xsl"/>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="olink-entity"/>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template name="olink-entity">
+  <xsl:variable name="xmlfile"
+                select="document(unparsed-entity-uri(@targetdocent),$autolayout)"/>
+  <xsl:variable name="webpage"
+                select="$xmlfile/webpage"/>
+  <xsl:variable name="tocentry"
+                select="$autolayout//*[$webpage/@id=@id]"/>
+
+  <xsl:variable name="dir">
+    <xsl:choose>
+      <xsl:when test="starts-with($tocentry/@dir, '/')">
+        <xsl:value-of select="substring($tocentry/@dir, 2)"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$tocentry/@dir"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+<!-- debug
+  <xsl:message>Olink for <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/></xsl:message>
+  <xsl:message>Page id <xsl:value-of select="$webpage/@id"/></xsl:message>
+-->
+
+  <xsl:choose>
+    <xsl:when test="@type = 'embed'">
+      <xsl:apply-templates select="$xmlfile"/>
+    </xsl:when>
+    <xsl:otherwise>
+      <!-- @type = 'replace' or @type = 'new' -->
+      <a>
+        <xsl:if test="@id">
+          <xsl:attribute name="name">
+            <xsl:value-of select="@id"/>
+          </xsl:attribute>
+        </xsl:if>
+
+<!-- debug
+        <xsl:message>
+          <xsl:text>href: </xsl:text>
+          <xsl:call-template name="root-rel-path"/>
+          <xsl:text>::</xsl:text>
+          <xsl:value-of select="$dir"/>
+          <xsl:text>::</xsl:text>
+          <xsl:value-of select="$filename-prefix"/>
+          <xsl:text>::</xsl:text>
+          <xsl:value-of select="$tocentry/@filename"/>
+          <xsl:text>::</xsl:text>
+          <xsl:if test="@localinfo">
+            <xsl:text>#</xsl:text>
+            <xsl:value-of select="@localinfo"/>
+          </xsl:if>
+        </xsl:message>
+-->
+
+        <xsl:attribute name="href">
+          <xsl:call-template name="root-rel-path"/>
+          <xsl:value-of select="$dir"/>
+          <xsl:value-of select="$filename-prefix"/>
+          <xsl:value-of select="$tocentry/@filename"/>
+          <xsl:if test="@localinfo">
+            <xsl:text>#</xsl:text>
+            <xsl:value-of select="@localinfo"/>
+          </xsl:if>
+        </xsl:attribute>
+
+        <xsl:if test="@type = 'new'">
+          <xsl:attribute name="target">_blank</xsl:attribute>
+        </xsl:if>
+
+        <xsl:choose>
+          <xsl:when test="count(node()) = 0">
+            <xsl:apply-templates select="$webpage/head/title"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:apply-templates/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </a>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template name="olink-xsl">
+  <xsl:param name="offsite.target.database" 
+      select="document($target.database.document, /)"/>
+  <xsl:param name="website.target.database" 
+      select="document($website.database.document, /)"/>
+
+<!-- debug 
+<xsl:message>In olink, $website.database.document is <xsl:value-of
+select="$website.database.document"/>
+</xsl:message>
+
+<xsl:message>In olink, $target.database.document is <xsl:value-of
+select="$target.database.document"/>
+</xsl:message>
+
+-->
+
+  <xsl:variable name="seek.targetdoc" select="@targetdoc"/>
+  <xsl:variable name="seek.targetptr" select="@targetptr"/>
+
+  <xsl:variable name="website.targetdoc.key" >
+    <xsl:for-each select="$website.target.database" >
+      <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/@targetdoc" />
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="website.targetptr.key" >
+    <xsl:for-each select="$website.target.database" >
+      <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc,
+                                '/', $seek.targetptr))/@targetptr" />
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="offsite.targetdoc.key" >
+    <xsl:for-each select="$offsite.target.database" >
+      <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/@targetdoc" />
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="offsite.targetptr.key" >
+    <xsl:for-each select="$offsite.target.database" >
+      <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc,
+                                '/', $seek.targetptr))/@targetptr" />
+    </xsl:for-each>
+  </xsl:variable>
+
+<!-- debug 
+<xsl:message>In olink, $website.targetptr.key is <xsl:value-of
+select="$website.targetptr.key"/>
+</xsl:message>
+<xsl:message>In olink, $offsite.targetptr.key is <xsl:value-of
+select="$offsite.targetptr.key"/>
+</xsl:message>
+-->
+
+  <xsl:call-template name="anchor"/>
+
+  <!-- Is the reference in the website or offsite database? -->
+  <xsl:variable name="targetdb">  
+    <xsl:choose>
+      <!-- Check for olink attributes -->
+      <xsl:when test="@targetdoc and not(@targetptr)" >
+        <xsl:message>Olink missing @targetptr attribute value</xsl:message>
+      </xsl:when>
+      <xsl:when test="not(@targetdoc) and @targetptr" >
+        <xsl:message>Olink missing @targetdoc attribute value</xsl:message>
+      </xsl:when>
+      <xsl:when test="@targetdoc and @targetptr">
+
+        <xsl:choose>
+          <xsl:when test="$website.targetptr.key != ''">
+            <xsl:value-of select="$website.database.document"/>
+          </xsl:when>
+          <xsl:when test="$offsite.targetptr.key != ''">
+            <xsl:value-of select="$target.database.document"/>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+    </xsl:choose>
+  </xsl:variable>
+
+<!-- debug
+<xsl:message>In olink, $targetdb is <xsl:value-of
+select="$targetdb"/>
+</xsl:message>
+-->
+
+  <xsl:choose>
+    <xsl:when test="$targetdb != ''">
+      <xsl:call-template name="process.olink">
+        <xsl:with-param name="this.database.document">
+          <xsl:value-of select="$targetdb"/>
+        </xsl:with-param>
+      </xsl:call-template>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:message>Olink error: targetptr "<xsl:value-of select="@targetptr"/>" not found for targetdoc "<xsl:value-of select="@targetdoc"/>".</xsl:message>
+      <xsl:choose>
+        <xsl:when test="$target.database.document = '' 
+                        and $website.database.document = ''">
+          <xsl:message>
+            <xsl:text>No olink database specified: must specify either a $target.database.document or $website.database.document parameter
+            </xsl:text>
+            <xsl:text>when using olinks with targetdoc and targetptr attributes.</xsl:text>
+          </xsl:message>
+        </xsl:when>
+        <xsl:otherwise>
+        <xsl:if test="$website.database.document != ''">
+          <xsl:choose>
+            <!-- Did it not open? Should be a targetset element -->
+           <xsl:when test="not($website.target.database/targetset)">
+              <xsl:message>    details: could not open website target database <xsl:value-of select="$website.database.document"/>.  </xsl:message>
+            </xsl:when>
+            <!-- Does it not have this document id? -->
+            <xsl:when test="$website.targetdoc.key = ''" >
+              <xsl:message>    details: targetdoc "<xsl:value-of select="$seek.targetdoc"/>" not in website target database.</xsl:message>
+            </xsl:when>
+            <!-- Does this document not have this targetptr? -->
+           <xsl:when test="$website.targetptr.key = ''" >
+              <!-- Does this document have *any* content? -->
+               <xsl:variable name="document.root">
+                <xsl:for-each select="$website.target.database" >
+                 <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/div/@element"/>
+                </xsl:for-each>
+              </xsl:variable>
+              <xsl:choose>
+                <xsl:when test="$document.root = ''">
+                  <xsl:message>    details: could not open data file for website document id '<xsl:value-of select="$seek.targetdoc"/>'.</xsl:message>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:message>    details: targetptr "<xsl:value-of select="$seek.targetptr"/>" not found for website targetdoc "<xsl:value-of select="$seek.targetdoc"/>".</xsl:message>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:when>
+          </xsl:choose>
+        </xsl:if>
+        <xsl:if test="$target.database.document != ''">
+          <xsl:choose>
+            <!-- Did it not open? Should be a targetset element -->
+           <xsl:when test="not($offsite.target.database/targetset)">
+              <xsl:message>    details: could not open offsite target database <xsl:value-of select="$target.database.document"/>.  </xsl:message>
+            </xsl:when>
+            <!-- Does it not have this document id? -->
+            <xsl:when test="$offsite.targetdoc.key = ''" >
+              <xsl:message>    details: targetdoc "<xsl:value-of select="$seek.targetdoc"/>" not in offsite target database.</xsl:message>
+            </xsl:when>
+            <!-- Does this document not have this targetptr? -->
+           <xsl:when test="$offsite.targetptr.key = ''" >
+              <!-- Does this document have *any* content? -->
+               <xsl:variable name="document.root">
+                <xsl:for-each select="$offsite.target.database" >
+                 <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/div/@element"/>
+                </xsl:for-each>
+              </xsl:variable>
+              <xsl:choose>
+                <xsl:when test="$document.root = ''">
+                  <xsl:message>    details: could not open data file for offsite targetdoc "<xsl:value-of select="$seek.targetdoc"/>".</xsl:message>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:message>    details: targetptr "<xsl:value-of select="$seek.targetptr"/>" not found in offsite targetdoc "<xsl:value-of select="$seek.targetdoc"/>".</xsl:message>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:when>
+          </xsl:choose>
+        </xsl:if>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:otherwise>
+  </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="process.olink">
+  <xsl:param name="this.database.document"/>
+  <xsl:param name="target.database"
+             select="document($this.database.document, /)"/>
+  <xsl:param name="seek.targetdoc" select="@targetdoc"/>
+  <xsl:param name="seek.targetptr" select="@targetptr"/>
+
+  <xsl:variable name="targetdoc.key" >
+    <xsl:for-each select="$target.database" >
+      <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/@targetdoc" />
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="targetptr.key" >
+    <xsl:for-each select="$target.database" >
+      <xsl:value-of select="key('targetptr-key',
+          concat($seek.targetdoc, '/', $seek.targetptr))/@targetptr" />
+    </xsl:for-each>
+  </xsl:variable>
+
+<!-- debug 
+<xsl:message>In process.olink and target.database.document is
+<xsl:value-of select="$this.database.document"/>
+</xsl:message>
+<xsl:message>In process.olink and targetdoc.key is
+<xsl:value-of select="$targetdoc.key"/>
+</xsl:message>
+<xsl:message>In process.olink and targetptr.key is
+<xsl:value-of select="$targetptr.key"/>
+</xsl:message>
+-->
+
+  <!-- Does the target database use a sitemap? -->
+  <!-- That is, does this key have a <dir> parent? -->
+  <xsl:variable name="use.sitemap">
+    <xsl:for-each select="$target.database" >
+      <xsl:value-of select="key('targetdoc-key',
+                   $targetdoc.key)/parent::dir/@name"/>
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="target.href" >
+    <xsl:for-each select="$target.database" >
+      <xsl:value-of select="key('targetptr-key', concat($targetdoc.key,
+                                '/', $targetptr.key))/@href" />
+
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="target.element" >
+    <xsl:for-each select="$target.database" >
+      <xsl:value-of select="key('targetptr-key', concat($targetdoc.key,
+                                '/', $targetptr.key))/@element" />
+
+    </xsl:for-each>
+  </xsl:variable>
+
+  <xsl:variable name="target.dir" >
+    <xsl:for-each select="$target.database" >
+      <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/@dir" />
+    </xsl:for-each>
+  </xsl:variable>
+
+  <!-- Get the baseuri for this targetptr -->
+
+  <xsl:variable name="baseuri" >
+    <xsl:choose>
+      <!-- Does the database use a sitemap? -->
+      <xsl:when test="$use.sitemap != ''" >
+        <xsl:choose>
+          <!-- Was current.docid parameter set? -->
+          <xsl:when test="$current.docid != ''">
+            <xsl:for-each select="$target.database" >
+              <xsl:call-template name="targetpath" >
+                <xsl:with-param name="dirnode" select="key('targetdoc-key',
+                                     $current.docid)/parent::dir"/>
+                <xsl:with-param name="targetdoc" select="$targetdoc.key"/>
+              </xsl:call-template>
+            </xsl:for-each >
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:message>Olink warning: cannot compute relative sitemap path without $current.docid parameter</xsl:message>
+          </xsl:otherwise>
+        </xsl:choose> 
+        <!-- In either case, add baseuri from its document entry-->
+        <xsl:variable name="docbaseuri">
+          <xsl:for-each select="$target.database" >
+            <xsl:value-of select="key('targetdoc-key',
+                                       $targetdoc.key)/@baseuri" />
+          </xsl:for-each>
+        </xsl:variable>
+        <xsl:if test="$docbaseuri != ''" >
+          <xsl:value-of select="$docbaseuri"/>
+        </xsl:if>
+      </xsl:when>
+      <!-- No database sitemap in use -->
+      <xsl:otherwise>
+        <!-- compute a root-relative path if current page has a @dir -->
+        <xsl:variable name="root-rel">
+          <xsl:call-template name="root-rel-path"/>
+        </xsl:variable>
+        <xsl:if test="$root-rel != ''">
+          <xsl:value-of select="$root-rel"/>
+        </xsl:if>
+       <!-- Add the target's @dir to the path -->
+        <xsl:if test="$target.dir != ''">
+          <xsl:value-of select="$target.dir"/>
+        </xsl:if>
+        <!-- Just use any baseuri from its document entry -->
+        <xsl:variable name="docbaseuri">
+          <xsl:for-each select="$target.database" >
+            <xsl:value-of select="key('targetdoc-key',
+                                      $seek.targetdoc)/@baseuri" />
+          </xsl:for-each>
+        </xsl:variable>
+        <xsl:if test="$docbaseuri != ''" >
+          <xsl:value-of select="$docbaseuri"/>
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <!-- Form the href information -->
+  <xsl:variable name="href">
+    <xsl:if test="$baseuri != ''">
+      <xsl:value-of select="$baseuri"/>
+      <xsl:if test="substring($target.href,1,1) != '#'">
+        <!--xsl:text>/</xsl:text-->
+      </xsl:if>
+    </xsl:if>
+    <xsl:choose>
+      <xsl:when test="$target.element = 'webpage' and
+                      $seek.targetdoc = $seek.targetptr">
+       <!-- Don't output #id because not needed -->
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$target.href"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:choose>
+    <xsl:when test="$href != ''">
+      <a href="{$href}">
+        <xsl:call-template name="olink.hottext">
+          <xsl:with-param name="target.database" select="$target.database"/>
+        </xsl:call-template>
+
+      </a>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="olink.hottext">
+        <xsl:with-param name="target.database" select="$target.database"/>
+      </xsl:call-template>
+    </xsl:otherwise>
+  </xsl:choose>
+
+</xsl:template>
+
+</xsl:stylesheet>
index 74a88447d1e8fdfe1291ce36787f5ba26ace5690..4f0d22cc6e394a8386ecde2ebe631d3ce1b52e42 100644 (file)
@@ -23,6 +23,7 @@
 <xsl:include href="param.xsl"/>
 <xsl:include href="head.xsl"/>
 <xsl:include href="rss.xsl"/>
+<xsl:include href="olink.xsl"/>
 
 <xsl:preserve-space elements="*"/>
 <xsl:strip-space elements="website webpage"/>
@@ -500,91 +501,6 @@ node.</para>
 
 <!-- ==================================================================== -->
 
-<xsl:template match="olink">
-  <xsl:variable name="xmlfile"
-                select="document(unparsed-entity-uri(@targetdocent),$autolayout)"/>
-  <xsl:variable name="webpage"
-                select="$xmlfile/webpage"/>
-  <xsl:variable name="tocentry"
-                select="$autolayout//*[$webpage/@id=@id]"/>
-
-  <xsl:variable name="dir">
-    <xsl:choose>
-      <xsl:when test="starts-with($tocentry/@dir, '/')">
-        <xsl:value-of select="substring($tocentry/@dir, 2)"/>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:value-of select="$tocentry/@dir"/>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:variable>
-
-<!--
-  <xsl:message>Olink for <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/></xsl:message>
-  <xsl:message>Page id <xsl:value-of select="$webpage/@id"/></xsl:message>
--->
-
-  <xsl:choose>
-    <xsl:when test="@type = 'embed'">
-      <xsl:apply-templates select="$xmlfile"/>
-    </xsl:when>
-    <xsl:otherwise>
-      <!-- @type = 'replace' or @type = 'new' -->
-      <a>
-        <xsl:if test="@id">
-          <xsl:attribute name="name">
-            <xsl:value-of select="@id"/>
-          </xsl:attribute>
-        </xsl:if>
-
-<!--
-        <xsl:message>
-          <xsl:text>href: </xsl:text>
-          <xsl:call-template name="root-rel-path"/>
-          <xsl:text>::</xsl:text>
-          <xsl:value-of select="$dir"/>
-          <xsl:text>::</xsl:text>
-          <xsl:value-of select="$filename-prefix"/>
-          <xsl:text>::</xsl:text>
-          <xsl:value-of select="$tocentry/@filename"/>
-          <xsl:text>::</xsl:text>
-          <xsl:if test="@localinfo">
-            <xsl:text>#</xsl:text>
-            <xsl:value-of select="@localinfo"/>
-          </xsl:if>
-        </xsl:message>
--->
-
-        <xsl:attribute name="href">
-          <xsl:call-template name="root-rel-path"/>
-          <xsl:value-of select="$dir"/>
-          <xsl:value-of select="$filename-prefix"/>
-          <xsl:value-of select="$tocentry/@filename"/>
-          <xsl:if test="@localinfo">
-            <xsl:text>#</xsl:text>
-            <xsl:value-of select="@localinfo"/>
-          </xsl:if>
-        </xsl:attribute>
-
-        <xsl:if test="@type = 'new'">
-          <xsl:attribute name="target">_blank</xsl:attribute>
-        </xsl:if>
-
-        <xsl:choose>
-          <xsl:when test="count(node()) = 0">
-            <xsl:apply-templates select="$webpage/head/title"/>
-          </xsl:when>
-          <xsl:otherwise>
-            <xsl:apply-templates/>
-          </xsl:otherwise>
-        </xsl:choose>
-      </a>
-    </xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-<!-- ==================================================================== -->
-
 <xsl:template name="page.uri">
   <xsl:param name="href" select="''"/>
   <xsl:param name="page" select="ancestor-or-self::tocentry"/>
@@ -757,4 +673,126 @@ node.</para>
   <xsl:value-of select="$tocentry/following-sibling::tocentry[last()]/@id"/>
 </xsl:template>
 
+<xsl:template match="autolayout" mode="collect.targets">
+  <targetset>
+    <xsl:apply-templates mode="olink.mode"/>
+  </targetset>
+</xsl:template>
+
+<xsl:template match="toc|tocentry|notoc" mode="olink.mode">
+    <xsl:text>&#10;</xsl:text>
+    <xsl:call-template name="tocentry"/>
+    <xsl:apply-templates select="tocentry" mode="olink.mode"/>
+</xsl:template>
+
+
+<xsl:template name="tocentry" mode="olink.mode">
+  <xsl:choose>
+    <xsl:when test="@href">
+      <!-- no op -->
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:if test="not(@page)">
+        <xsl:message terminate="yes">
+          <xsl:text>All toc entries must have a page attribute.</xsl:text>
+        </xsl:message>
+      </xsl:if>
+    
+      <xsl:variable name="page" select="document(@page,.)"/>
+    
+      <xsl:if test="not($page/*[1]/@id)">
+        <xsl:message terminate="yes">
+          <xsl:value-of select="@page"/>
+          <xsl:text>: missing ID.</xsl:text>
+        </xsl:message>
+      </xsl:if>
+    
+      <xsl:variable name="id" select="$page/*[1]/@id"/>
+    
+      <xsl:variable name="filename">
+        <xsl:choose>
+          <xsl:when test="@filename">
+            <xsl:value-of select="@filename"/>
+          </xsl:when>
+          <xsl:when test="/layout/config[@param='default-filename']">
+            <xsl:value-of select="(/layout/config[@param='default-filename'])[1]/@value"/>
+          </xsl:when>
+          <xsl:otherwise>index.html</xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+    
+      <xsl:variable name="dir" select="@dir"/>
+    
+      <xsl:if test="$filename = ''">
+        <xsl:message terminate="yes">
+          <xsl:value-of select="@page"/>
+          <xsl:text>: missing filename.</xsl:text>
+        </xsl:message>
+      </xsl:if>
+    
+    <!--
+      <xsl:message>
+        <xsl:value-of select="@page"/>
+        <xsl:text>: </xsl:text>
+        <xsl:if test="$dir != ''">
+          <xsl:value-of select="$dir"/>
+        </xsl:if>
+        <xsl:value-of select="$filename"/>
+      </xsl:message>
+    -->
+    
+      <document>
+        <xsl:attribute name="targetdoc">
+          <xsl:value-of select="$id"/>
+        </xsl:attribute>
+        <xsl:attribute name="baseuri">
+          <xsl:value-of select="$filename"/>
+        </xsl:attribute>
+        <xsl:if test="$dir != ''">
+          <xsl:attribute name="dir">
+            <xsl:value-of select="$dir"/>
+          </xsl:attribute>
+        </xsl:if>
+    
+        <xsl:apply-templates select="$page" mode="olink.mode"/>
+      </document>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="webpage" mode="olink.mode">
+  <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="webpage" mode="xref-to" >
+  <xsl:param name="referrer"/>
+  <xsl:param name="xrefstyle"/>
+
+  <xsl:apply-templates select="." mode="object.xref.markup">
+    <xsl:with-param name="purpose" select="'xref'"/>
+    <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+    <xsl:with-param name="referrer" select="$referrer"/>
+  </xsl:apply-templates>
+  <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="webpage" mode="title.markup">
+  <xsl:param name="allow-anchors" select="0"/>
+  <xsl:apply-templates select=".//head/title"
+                       mode="title.markup">
+    <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+  </xsl:apply-templates>
+</xsl:template>
+
+<xsl:param name="local.l10n.xml" select="document('')" />
+<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"> 
+  <l:l10n language="en">
+    <l:context name="title">
+      <l:template name="webpage" text="%t"/>
+    </l:context>
+    <l:context name="xref">
+      <l:template name="webpage" text="%t"/>
+    </l:context>
+  </l:l10n>
+</l:i18n>
 </xsl:stylesheet>
diff --git a/website/xsl/website-targets.xsl b/website/xsl/website-targets.xsl
new file mode 100644 (file)
index 0000000..2cd0b25
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="1.0">
+
+<xsl:import href="tabular.xsl"/>
+
+<xsl:output method="xml" 
+         indent="no" 
+        encoding="utf-8"
+         doctype-public="-//Norman Walsh//DTD DocBook OLink Summary V2.0//EN"
+         doctype-system="http://docbook.sourceforge.net/release/xsl/current/common/targetdatabase.dtd"/>
+
+
+<!-- Used only when processing autolayout.xml -->
+<xsl:template match="/">
+  <xsl:apply-templates mode="collect.targets"/>
+</xsl:template>
+
+<xsl:template match="*"/>
+
+<xsl:template match="autolayout" mode="collect.targets">
+  <targetset>
+    <xsl:apply-templates mode="olink.mode"/>
+  </targetset>
+</xsl:template>
+
+</xsl:stylesheet>