]> granicus.if.org Git - docbook-dsssl/commitdiff
Modified for the new stylesheet olink system.
authorBob Stayton <bobs@sagehill.net>
Fri, 5 Jul 2002 08:27:32 +0000 (08:27 +0000)
committerBob Stayton <bobs@sagehill.net>
Fri, 5 Jul 2002 08:27:32 +0000 (08:27 +0000)
Modfified olink template to support the new
targetdoc and targetptr attributes.
Loads target database into keys for fast lookup.

xsl/fo/xref.xsl

index 1d8b1774bb015f5273958abf7f2c126981938801..ef4623db9ef67b3dbf7bbc7cfc4aced897eee4bb 100644 (file)
 
      ******************************************************************** -->
 
+<!-- Create keys for quickly looking up olink targets -->
+<xsl:key name="targetdoc-key" match="document" use="@targetdoc" />
+<xsl:key name="targetptr-key"  match="div|obj"
+         use="concat(ancestor::document/@targetdoc, '/', @targetptr)" />
+
 <!-- ==================================================================== -->
 
 <xsl:template match="anchor">
   </xsl:choose>
 </xsl:template>
 
-<xsl:template match="olink" name="olink">
-  <xsl:apply-templates/>
+
+<xsl:template match="olink">
+  <xsl:variable name="localinfo" select="@localinfo"/>
+
+  <!-- Open the olink targets data base -->
+  <xsl:param name="target.database" 
+      select="document($target.database.document)"/>
+
+  <!-- Olink that points to internal id can be a link -->
+  <xsl:variable name="linkend">
+    <xsl:choose>
+      <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:if test="$current.docid = @targetdoc">
+          <xsl:if test="id(@targetptr)">
+            <xsl:value-of select="@targetptr"/>
+          </xsl:if>
+        </xsl:if>
+      </xsl:when>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:choose>
+    <xsl:when test="$linkend != ''">
+      <fo:basic-link internal-destination="{$linkend}"
+                   xsl:use-attribute-sets="xref.properties">
+        <xsl:call-template name="olink.hottext">
+          <xsl:with-param name="target.database" select="$target.database"/>
+        </xsl:call-template>
+      </fo:basic-link>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="olink.hottext">
+        <xsl:with-param name="target.database" select="$target.database"/>
+      </xsl:call-template>
+
+      <!-- Append other document title if appropriate -->
+      <xsl:if test="@targetdoc and @targetptr and $olink.doctitle != 0
+                  and $current.docid != '' and $current.docid != @targetdoc">
+        <xsl:variable name="doctitle">
+          <xsl:variable name="seek.targetdoc" select="@targetdoc"/>
+          <xsl:for-each select="$target.database" >
+            <xsl:value-of select="key('targetdoc-key', $seek.targetdoc)/div[1]/ttl" />
+          </xsl:for-each>
+        </xsl:variable>
+        <xsl:if test="$doctitle != ''">
+          <xsl:text> (</xsl:text><xsl:value-of select="$doctitle"/><xsl:text>)</xsl:text>
+        </xsl:if>
+      </xsl:if>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="olink.hottext">
+    <xsl:choose>
+      <!-- If it has elements or text (not just PI or comment) -->
+      <xsl:when test="child::text() or child::*">
+        <xsl:apply-templates/>
+      </xsl:when>
+      <xsl:when test="@targetdoc and @targetptr">
+        <!-- Get the xref text for this record -->
+        <xsl:variable name="seek.targetdoc" select="@targetdoc"/>
+        <xsl:variable name="seek.targetptr" select="@targetptr"/>
+        <xsl:variable name="xref.text" >
+          <xsl:for-each select="$target.database" >
+            <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc, '/', $seek.targetptr))/xreftext" />
+
+          </xsl:for-each>
+        </xsl:variable>
+
+
+        <xsl:choose>
+          <xsl:when test="$use.local.olink.style != 0">
+            <!-- Get the element name and lang for this targetptr -->
+            <xsl:variable name="element" >
+              <xsl:for-each select="$target.database" >
+                <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc, '/', $seek.targetptr))/@element" />
+              </xsl:for-each>
+            </xsl:variable>
+
+            <xsl:variable name="lang">
+              <xsl:variable name="candidate">
+                <xsl:for-each select="$target.database" >
+                  <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc, '/', $seek.targetptr))/@lang" />
+                </xsl:for-each>
+              </xsl:variable>
+              <xsl:choose>
+                <xsl:when test="$candidate != ''">
+                  <xsl:value-of select="$candidate"/>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:value-of select="'en'"/>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable> 
+            <xsl:variable name="template">
+              <xsl:call-template name="gentext.template">
+                <xsl:with-param name="context" select="'title'"/>
+                <xsl:with-param name="name" select="$element"/>
+                <xsl:with-param name="lang" select="$lang"/>
+              </xsl:call-template>
+            </xsl:variable>
+            <xsl:call-template name="substitute-markup">
+              <xsl:with-param name="template" select="$template"/>
+              <xsl:with-param name="title">
+                <xsl:for-each select="$target.database" >
+                  <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc, '/', $seek.targetptr))/ttl" />
+                </xsl:for-each>
+              </xsl:with-param>
+              <xsl:with-param name="label">
+                <xsl:for-each select="$target.database" >
+                  <xsl:value-of select="key('targetptr-key', concat($seek.targetdoc, '/', $seek.targetptr))/@number" />
+                </xsl:for-each>
+              </xsl:with-param>
+            </xsl:call-template>
+          </xsl:when>
+          <xsl:when test="$xref.text !=''">
+            <xsl:value-of select="$xref.text"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:message>Olink error: no generated text for targetdoc/targetptr = <xsl:value-of select="@targetdoc"/>/<xsl:value-of select="@targetptr"/></xsl:message>
+            <xsl:text>????</xsl:text>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:call-template name="olink.outline">
+          <xsl:with-param name="outline.base.uri"
+                          select="unparsed-entity-uri(@targetdocent)"/>
+          <xsl:with-param name="localinfo" select="@localinfo"/>
+          <xsl:with-param name="return" select="'xreftext'"/>
+        </xsl:call-template>
+      </xsl:otherwise>
+    </xsl:choose>
 </xsl:template>
 
+
 <!-- ==================================================================== -->
 
 <xsl:template name="title.xref">