]> granicus.if.org Git - docbook-dsssl/commitdiff
Extended full olink support to FO output.
authorBob Stayton <bobs@sagehill.net>
Mon, 9 Aug 2004 00:31:05 +0000 (00:31 +0000)
committerBob Stayton <bobs@sagehill.net>
Mon, 9 Aug 2004 00:31:05 +0000 (00:31 +0000)
xsl/fo/docbook.xsl
xsl/fo/fo.xsl
xsl/fo/param.ent
xsl/fo/param.xweb
xsl/fo/xref.xsl

index d035b2f1b4d7c291d8873a6c325584cd060049f9..c60f5d0d92a78096fcf4e46d594a1bbc570e0584 100644 (file)
@@ -31,6 +31,8 @@
 <xsl:include href="../common/titles.xsl"/>
 <xsl:include href="../common/subtitles.xsl"/>
 <xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
 <xsl:include href="../common/pi.xsl"/>
 <xsl:include href="autotoc.xsl"/>
 <xsl:include href="autoidx.xsl"/>
@@ -68,6 +70,7 @@
 <xsl:include href="pi.xsl"/>
 <xsl:include href="ebnf.xsl"/>
 <xsl:include href="docbookng.xsl"/>
+<xsl:include href="../html/chunker.xsl"/>
 
 <xsl:include href="fop.xsl"/>
 <xsl:include href="passivetex.xsl"/>
       <!-- to documents that don't have one. But not before the whole stylesheet -->
       <!-- has been converted to use namespaces. i.e., don't hold your breath -->
       <xsl:variable name="nons">
-       <xsl:apply-templates mode="stripNS"/>
+        <xsl:apply-templates mode="stripNS"/>
       </xsl:variable>
       <xsl:apply-templates select="exsl:node-set($nons)"/>
     </xsl:when>
     <xsl:otherwise>
-      <xsl:variable name="document.element" select="*[1]"/>
-
-      <xsl:if test="not(contains($root.elements,
-                                concat(' ', local-name($document.element), ' ')))">
-       <xsl:message terminate="yes">
-         <xsl:text>ERROR: Document root element for FO output </xsl:text>
-         <xsl:text>must be one of the following elements:</xsl:text>
-         <xsl:value-of select="$root.elements"/>
-       </xsl:message>
-      </xsl:if>
+      <xsl:choose>
+        <xsl:when test="$rootid != ''">
+          <xsl:variable name="root.element" select="key('id', $rootid)"/>
+          <xsl:choose>
+            <xsl:when test="count($root.element) = 0">
+              <xsl:message terminate="yes">
+                <xsl:text>ID '</xsl:text>
+                <xsl:value-of select="$rootid"/>
+                <xsl:text>' not found in document.</xsl:text>
+              </xsl:message>
+            </xsl:when>
+            <xsl:when test="not(contains($root.elements, concat(' ', local-name($root.element), ' ')))">
+              <xsl:message terminate="yes">
+                <xsl:text>ERROR: Document root element ($rootid=</xsl:text>
+                <xsl:value-of select="$rootid"/>
+                <xsl:text>) for FO output </xsl:text>
+                <xsl:text>must be one of the following elements:</xsl:text>
+                <xsl:value-of select="$root.elements"/>
+              </xsl:message>
+            </xsl:when>
+            <!-- Otherwise proceed -->
+            <xsl:otherwise>
+              <xsl:if test="$collect.xref.targets = 'yes' or
+                            $collect.xref.targets = 'only'">
+                <xsl:apply-templates select="$root.element"
+                                     mode="collect.targets"/>
+              </xsl:if>
+              <xsl:if test="$collect.xref.targets != 'only'">
+                <xsl:apply-templates select="$root.element"
+                                     mode="process.root"/>
+              </xsl:if>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:when>
+        <!-- Otherwise process the document root element -->
+        <xsl:otherwise>
+          <xsl:variable name="document.element" select="*[1]"/>
+          <xsl:choose>
+            <xsl:when test="not(contains($root.elements,
+                     concat(' ', local-name($document.element), ' ')))">
+              <xsl:message terminate="yes">
+                <xsl:text>ERROR: Document root element for FO output </xsl:text>
+                <xsl:text>must be one of the following elements:</xsl:text>
+                <xsl:value-of select="$root.elements"/>
+              </xsl:message>
+            </xsl:when>
+            <!-- Otherwise proceed -->
+            <xsl:otherwise>
+              <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="/"
+                                     mode="process.root"/>
+              </xsl:if>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
 
-      <xsl:call-template name="root.messages"/>
+<xsl:template match="*" mode="process.root">
+  <xsl:variable name="document.element" select="self::*"/>
 
-      <xsl:variable name="title">
-       <xsl:choose>
-         <xsl:when test="$document.element/title[1]">
-           <xsl:value-of select="$document.element/title[1]"/>
-         </xsl:when>
-         <xsl:otherwise>[could not find document title]</xsl:otherwise>
-       </xsl:choose>
+  <xsl:call-template name="root.messages"/>
+
+  <xsl:variable name="title">
+    <xsl:choose>
+      <xsl:when test="$document.element/title[1]">
+        <xsl:value-of select="$document.element/title[1]"/>
+      </xsl:when>
+      <xsl:otherwise>[could not find document title]</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+  
+  <fo:root xsl:use-attribute-sets="root.properties">
+    <xsl:attribute name="language">
+      <xsl:call-template name="l10n.language">
+        <xsl:with-param name="target" select="/*[1]"/>
+      </xsl:call-template>
+    </xsl:attribute>
+
+    <xsl:if test="$xep.extensions != 0">
+      <xsl:call-template name="xep-document-information"/>
+    </xsl:if>
+    <xsl:if test="$axf.extensions != 0">
+      <xsl:call-template name="axf-document-information"/>
+    </xsl:if>
+
+    <xsl:call-template name="setup.pagemasters"/>
+
+    <xsl:if test="$fop.extensions != 0">
+      <xsl:apply-templates mode="fop.outline"/>
+    </xsl:if>
+    <xsl:if test="$xep.extensions != 0">
+      <xsl:variable name="bookmarks">
+        <xsl:apply-templates mode="xep.outline"/>
       </xsl:variable>
-      
-      <fo:root xsl:use-attribute-sets="root.properties">
-       <xsl:attribute name="language">
-         <xsl:call-template name="l10n.language">
-           <xsl:with-param name="target" select="/*[1]"/>
-         </xsl:call-template>
-       </xsl:attribute>
-
-       <xsl:if test="$xep.extensions != 0">
-         <xsl:call-template name="xep-document-information"/>
-       </xsl:if>
-       <xsl:if test="$axf.extensions != 0">
-         <xsl:call-template name="axf-document-information"/>
-       </xsl:if>
-       <xsl:call-template name="setup.pagemasters"/>
-       <xsl:choose>
-         <xsl:when test="$rootid != ''">
-           <xsl:choose>
-             <xsl:when test="count(key('id',$rootid)) = 0">
-               <xsl:message terminate="yes">
-                 <xsl:text>ID '</xsl:text>
-                 <xsl:value-of select="$rootid"/>
-                 <xsl:text>' not found in document.</xsl:text>
-               </xsl:message>
-             </xsl:when>
-             <xsl:otherwise>
-               <xsl:if test="$fop.extensions != 0">
-                 <xsl:apply-templates select="key('id',$rootid)" mode="fop.outline"/>
-               </xsl:if>
-               <xsl:if test="$xep.extensions != 0">
-                 <xsl:variable name="bookmarks">
-                   <xsl:apply-templates select="key('id',$rootid)" mode="xep.outline"/>
-                 </xsl:variable>
-                 <xsl:if test="string($bookmarks) != ''">
-                   <rx:outline xmlns:rx="http://www.renderx.com/XSL/Extensions">
-                     <xsl:copy-of select="$bookmarks"/>
-                   </rx:outline>
-                 </xsl:if>
-               </xsl:if>
-               <xsl:apply-templates select="key('id',$rootid)"/>
-             </xsl:otherwise>
-           </xsl:choose>
-         </xsl:when>
-         <xsl:otherwise>
-           <xsl:if test="$fop.extensions != 0">
-             <xsl:apply-templates mode="fop.outline"/>
-           </xsl:if>
-           <xsl:if test="$xep.extensions != 0">
-             <xsl:variable name="bookmarks">
-               <xsl:apply-templates mode="xep.outline"/>
-             </xsl:variable>
-             <xsl:if test="string($bookmarks) != ''">
-               <rx:outline xmlns:rx="http://www.renderx.com/XSL/Extensions">
-                 <xsl:copy-of select="$bookmarks"/>
-               </rx:outline>
-             </xsl:if>
-           </xsl:if>
-           <xsl:apply-templates/>
-         </xsl:otherwise>
-       </xsl:choose>
-      </fo:root>
-    </xsl:otherwise>
-  </xsl:choose>
+      <xsl:if test="string($bookmarks) != ''">
+        <rx:outline xmlns:rx="http://www.renderx.com/XSL/Extensions">
+          <xsl:copy-of select="$bookmarks"/>
+        </rx:outline>
+      </xsl:if>
+    </xsl:if>
+    <xsl:apply-templates select="$document.element"/>
+  </fo:root>
 </xsl:template>
 
 <xsl:template name="root.messages">
   <xsl:choose>
     <xsl:when test="namespace-uri(.) = 'http://docbook.org/docbook-ng'">
       <xsl:element name="{local-name(.)}">
-       <xsl:copy-of select="@*"/>
-       <xsl:apply-templates mode="stripNS"/>
+        <xsl:copy-of select="@*"/>
+        <xsl:apply-templates mode="stripNS"/>
       </xsl:element>
     </xsl:when>
     <xsl:otherwise>
       <xsl:copy>
-       <xsl:copy-of select="@*"/>
-       <xsl:apply-templates mode="stripNS"/>
+        <xsl:copy-of select="@*"/>
+        <xsl:apply-templates mode="stripNS"/>
       </xsl:copy>
     </xsl:otherwise>
   </xsl:choose>
index 828e2b4bd879f135fc1c008d6bd853b660a0ce53..433dd7966132f80f1fb8754b0415b8a2ab9178d9 100644 (file)
   </xsl:choose>
 </xsl:template>
 
+<xsl:template name="href.target">
+  <xsl:param name="context" select="."/>
+  <xsl:param name="object" select="."/>
+  <xsl:text>#</xsl:text>
+  <xsl:call-template name="object.id">
+    <xsl:with-param name="object" select="$object"/>
+  </xsl:call-template>
+</xsl:template>
+
 </xsl:stylesheet>
 
index 15ada3be00c04797aa98379f436d807cfeb16018..ae2a3ab0fff20f854c28f18e51c3db958c531171 100644 (file)
 <!ENTITY nominal.table.width SYSTEM "../params/nominal.table.width.xml">
 <!ENTITY normal.para.spacing SYSTEM "../params/normal.para.spacing.xml">
 <!ENTITY olink.doctitle SYSTEM "../params/olink.doctitle.xml">
+<!ENTITY olink.base.uri SYSTEM "../params/olink.base.uri.xml">
+<!ENTITY olink.properties SYSTEM "../params/olink.properties.xml">
+<!ENTITY olink.debug SYSTEM "../params/olink.debug.xml">
+<!ENTITY collect.xref.targets SYSTEM "../params/collect.xref.targets.xml">
+<!ENTITY targets.filename SYSTEM "../params/targets.filename.xml">
+<!ENTITY prefer.internal.olink SYSTEM "../params/prefer.internal.olink.xml">
+<!ENTITY insert.olink.pdf.frag SYSTEM "../params/insert.olink.pdf.frag.xml">
+<!ENTITY insert.olink.page.number SYSTEM "../params/insert.olink.page.number.xml">
+<!ENTITY olink.lang.fallback.sequence SYSTEM "../params/olink.lang.fallback.sequence.xml">
 <!ENTITY page.height SYSTEM "../params/page.height.xml">
 <!ENTITY page.height.portrait SYSTEM "../params/page.height.portrait.xml">
 <!ENTITY page.margin.bottom SYSTEM "../params/page.margin.bottom.xml">
index 55d1de5bb2e4c63241d602c5b4e6f6efaea45149..eba49bc1b33b8677d7c02767938b5d7ef6846c3b 100644 (file)
@@ -175,10 +175,19 @@ generate.section.toc.level;
 </reference>
 
 <reference><title>Linking</title>
-&target.database.document;
-&use.local.olink.style;
 &current.docid;
+&collect.xref.targets;
+&insert.olink.page.number;
+&insert.olink.pdf.frag;
+&olink.base.uri;
+&olink.debug;
 &olink.doctitle;
+&olink.lang.fallback.sequence;
+&olink.properties;
+&prefer.internal.olink;
+&target.database.document;
+&targets.filename;
+&use.local.olink.style;
 </reference>
 
 <reference><title>QAndASet</title>
@@ -523,6 +532,7 @@ around all these parameters.</para>
 <src:fragref linkend="callout.unicode.start.character.frag"/>
 <src:fragref linkend="callouts.extension.frag"/>
 <src:fragref linkend="chapter.autolabel.frag"/>
+<src:fragref linkend="collect.xref.targets.frag"/>
 <src:fragref linkend="column.count.back.frag"/>
 <src:fragref linkend="column.count.body.frag"/>
 <src:fragref linkend="column.count.front.frag"/>
@@ -616,6 +626,13 @@ around all these parameters.</para>
 <src:fragref linkend="nominal.table.width.frag"/>
 <src:fragref linkend="normal.para.spacing.frag"/>
 <src:fragref linkend="olink.doctitle.frag"/>
+<src:fragref linkend="olink.base.uri.frag"/>
+<src:fragref linkend="olink.debug.frag"/>
+<src:fragref linkend="olink.properties.frag"/>
+<src:fragref linkend="olink.lang.fallback.sequence.frag"/>
+<src:fragref linkend="prefer.internal.olink.frag"/>
+<src:fragref linkend="insert.olink.page.number.frag"/>
+<src:fragref linkend="insert.olink.pdf.frag.frag"/>
 <src:fragref linkend="page.height.frag"/>
 <src:fragref linkend="page.height.portrait.frag"/>
 <src:fragref linkend="page.margin.bottom.frag"/>
@@ -708,6 +725,7 @@ around all these parameters.</para>
 <src:fragref linkend="tablecolumns.extension.frag"/>
 <src:fragref linkend="table.table.properties.frag"/>
 <src:fragref linkend="target.database.document.frag"/>
+<src:fragref linkend="targets.filename.frag"/>
 <src:fragref linkend="textdata.default.encoding.frag"/>
 <src:fragref linkend="tex.math.delims.frag"/>
 <src:fragref linkend="tex.math.in.alt.frag"/>
index a669587fd65b3f3c97a7d53c758586b2708066b4..d05676ea5bbc0ff0392241964d3a7fea4c6f056b 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">
                 and (contains(@xrefstyle, 'page')
                      or contains(@xrefstyle, 'Page')))
                 and ( $insert.xref.page.number = 'yes' 
-                  or $insert.xref.page.number = '1')
+                   or $insert.xref.page.number = '1')
                 or local-name($target) = 'para'">
     <fo:basic-link internal-destination="{@linkend}"
                    xsl:use-attribute-sets="xref.properties">
 <xsl:template match="*" mode="xref-to">
   <xsl:param name="referrer"/>
   <xsl:param name="xrefstyle"/>
+  <xsl:param name="verbose" select="1"/>
+
 
-  <xsl:message>
-    <xsl:text>Don't know what gentext to create for xref to: "</xsl:text>
-    <xsl:value-of select="name(.)"/>
-    <xsl:text>"</xsl:text>
-  </xsl:message>
-  <xsl:text>???</xsl:text>
+  <xsl:if test="$verbose != 0">
+    <xsl:message>
+      <xsl:text>Don't know what gentext to create for xref to: "</xsl:text>
+      <xsl:value-of select="name(.)"/>
+      <xsl:text>"</xsl:text>
+    </xsl:message>
+    <xsl:text>???</xsl:text>
+  </xsl:if>
 </xsl:template>
 
 <xsl:template match="title" mode="xref-to">
               mode="xref-to">
   <xsl:param name="referrer"/>
   <xsl:param name="xrefstyle"/>
+  <xsl:param name="verbose" select="1"/>
 
   <!-- catch-all for things with (possibly optional) titles -->
   <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:with-param name="verbose" select="$verbose"/>
   </xsl:apply-templates>
 </xsl:template>
 
 <xsl:template match="procedure" mode="xref-to">
   <xsl:param name="referrer"/>
   <xsl:param name="xrefstyle"/>
+  <xsl:param name="verbose"/>
 
   <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:with-param name="verbose" select="$verbose"/>
   </xsl:apply-templates>
 </xsl:template>
 
 <xsl:template match="listitem" mode="xref-to">
   <xsl:param name="referrer"/>
   <xsl:param name="xrefstyle"/>
+  <xsl:param name="verbose" select="1"/>
 
   <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:with-param name="verbose" select="$verbose"/>
   </xsl:apply-templates>
 </xsl:template>
 
 <xsl:template match="qandaset" mode="xref-to">
   <xsl:param name="referrer"/>
   <xsl:param name="xrefstyle"/>
+  <xsl:param name="verbose" select="1"/>
 
   <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:with-param name="verbose" select="$verbose"/>
   </xsl:apply-templates>
 </xsl:template>
 
 <xsl:template match="qandadiv" mode="xref-to">
   <xsl:param name="referrer"/>
   <xsl:param name="xrefstyle"/>
+  <xsl:param name="verbose" select="1"/>
 
   <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:with-param name="verbose" select="$verbose"/>
   </xsl:apply-templates>
 </xsl:template>
 
     <!-- yes, show the URI -->
     <xsl:choose>
       <xsl:when test="$ulink.footnotes != 0 and not(ancestor::footnote)">
-       <xsl:text>&#xA0;</xsl:text>
+        <xsl:text>&#xA0;</xsl:text>
         <fo:footnote>
           <xsl:call-template name="ulink.footnote.number"/>
           <fo:footnote-body font-family="{$body.fontset}"
   </xsl:choose>
 </xsl:template>
 
-
-<xsl:template match="olink">
-  <xsl:param name="target.database"
-      select="document($target.database.document, /)"/>
+<xsl:template match="olink" name="olink">
+  <xsl:call-template name="anchor"/>
 
   <xsl:variable name="localinfo" select="@localinfo"/>
 
-  <!-- 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">
+    <!-- olinks resolved by stylesheet and target database -->
+    <xsl:when test="@targetdoc or @targetptr" >
+      <xsl:variable name="targetdoc.att" select="@targetdoc"/>
+      <xsl:variable name="targetptr.att" select="@targetptr"/>
+
+      <xsl:variable name="olink.lang">
+        <xsl:call-template name="l10n.language">
+          <xsl:with-param name="xref-context" select="true()"/>
+        </xsl:call-template>
+      </xsl:variable>
+    
+      <xsl:variable name="target.database.filename">
+        <xsl:call-template name="select.target.database">
+          <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+          <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+          <xsl:with-param name="olink.lang" select="$olink.lang"/>
+        </xsl:call-template>
+      </xsl:variable>
+    
+      <xsl:variable name="target.database" 
+          select="document($target.database.filename, /)"/>
+    
+      <xsl:if test="$olink.debug != 0">
+        <xsl:message>
+          <xsl:text>Olink debug: root element of target.database is '</xsl:text>
+          <xsl:value-of select="local-name($target.database/*[1])"/>
+          <xsl:text>'.</xsl:text>
+        </xsl:message>
+      </xsl:if>
+    
+      <xsl:variable name="olink.key">
+        <xsl:call-template name="select.olink.key">
+          <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+          <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+          <xsl:with-param name="olink.lang" select="$olink.lang"/>
           <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:variable>
+    
+      <xsl:if test="string-length($olink.key) = 0">
+        <xsl:message>
+          <xsl:text>Error: unresolved olink: </xsl:text>
+          <xsl:text>targetdoc/targetptr = '</xsl:text>
+          <xsl:value-of select="$targetdoc.att"/>
+          <xsl:text>/</xsl:text>
+          <xsl:value-of select="$targetptr.att"/>
+          <xsl:text>'.</xsl:text>
+        </xsl:message>
       </xsl:if>
-    </xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
 
+      <xsl:variable name="href">
+        <xsl:call-template name="make.olink.href">
+          <xsl:with-param name="olink.key" select="$olink.key"/>
+          <xsl:with-param name="target.database" select="$target.database"/>
+        </xsl:call-template>
+      </xsl:variable>
+
+      <!-- Olink that points to internal id can be a link -->
+      <xsl:variable name="linkend">
+        <xsl:call-template name="olink.as.linkend">
+          <xsl:with-param name="olink.key" select="$olink.key"/>
+          <xsl:with-param name="olink.lang" select="$olink.lang"/>
+          <xsl:with-param name="target.database" select="$target.database"/>
+        </xsl:call-template>
+      </xsl:variable>
 
-<xsl:template name="olink.hottext">
-  <xsl:param name="target.database"/>
+      <xsl:variable name="hottext">
+        <xsl:call-template name="olink.hottext">
+          <xsl:with-param name="olink.key" select="$olink.key"/>
+          <xsl:with-param name="olink.lang" select="$olink.lang"/>
+          <xsl:with-param name="target.database" select="$target.database"/>
+        </xsl:call-template>
+      </xsl:variable>
 
-  <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 name="olink.docname.citation">
+        <xsl:call-template name="olink.document.citation">
+          <xsl:with-param name="olink.key" select="$olink.key"/>
+          <xsl:with-param name="target.database" select="$target.database"/>
+          <xsl:with-param name="olink.lang" select="$olink.lang"/>
+        </xsl:call-template>
+      </xsl:variable>
+
+      <xsl:variable name="olink.page.citation">
+        <xsl:call-template name="olink.page.citation">
+          <xsl:with-param name="olink.key" select="$olink.key"/>
+          <xsl:with-param name="target.database" select="$target.database"/>
+          <xsl:with-param name="olink.lang" select="$olink.lang"/>
+          <xsl:with-param name="linkend" select="$linkend"/>
+        </xsl:call-template>
       </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 test="$linkend != ''">
+          <fo:basic-link internal-destination="{$linkend}"
+                       xsl:use-attribute-sets="xref.properties">
+            <xsl:copy-of select="$hottext"/>
+            <xsl:copy-of select="$olink.page.citation"/>
+          </fo:basic-link>
         </xsl:when>
-        <xsl:when test="$xref.text !=''">
-          <xsl:value-of select="$xref.text"/>
+        <xsl:when test="$href != ''">
+          <xsl:choose>
+            <xsl:when test="$xep.extensions != 0">
+              <fo:basic-link external-destination="url({$href})"
+                             xsl:use-attribute-sets="olink.properties">
+                <xsl:copy-of select="$hottext"/>
+              </fo:basic-link>
+              <xsl:copy-of select="$olink.page.citation"/>
+              <xsl:copy-of select="$olink.docname.citation"/>
+            </xsl:when>
+            <xsl:when test="$axf.extensions != 0">
+              <fo:basic-link external-destination="{$href}"
+                             xsl:use-attribute-sets="xref.properties"
+                             show-destination="replace">
+                <xsl:copy-of select="$hottext"/>
+              </fo:basic-link>
+              <xsl:copy-of select="$olink.page.citation"/>
+              <xsl:copy-of select="$olink.docname.citation"/>
+            </xsl:when>
+            <xsl:otherwise>
+              <fo:basic-link external-destination="{$href}"
+                             xsl:use-attribute-sets="xref.properties"
+                             show-destination="replace">
+                <xsl:copy-of select="$hottext"/>
+              </fo:basic-link>
+              <xsl:copy-of select="$olink.page.citation"/>
+              <xsl:copy-of select="$olink.docname.citation"/>
+            </xsl:otherwise>
+          </xsl:choose>
         </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:copy-of select="$hottext"/>
+          <xsl:copy-of select="$olink.page.citation"/>
+          <xsl:copy-of select="$olink.docname.citation"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:when>
+
+    <!-- olink never implemented in FO for old olink entity syntax -->
     <xsl:otherwise>
-      <xsl:text>????</xsl:text>
-<!--
-      <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:apply-templates/>
     </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
 
+<xsl:template match="*" mode="insert.olink.docname.markup">
+  <xsl:param name="docname" select="''"/>
+  
+  <fo:inline font-style="italic">
+    <xsl:value-of select="$docname"/>
+  </fo:inline>
+
+</xsl:template>
+
+<!-- This prevents error message when processing olinks with xrefstyle -->
+<xsl:template match="olink" mode="object.xref.template"/>
+
+
+<xsl:template name="olink.as.linkend">
+  <xsl:param name="olink.key" select="''"/>
+  <xsl:param name="olink.lang" select="''"/>
+  <xsl:param name="target.database" select="NotANode"/>
+
+  <xsl:variable name="targetdoc">
+    <xsl:value-of select="substring-before($olink.key, '/')"/>
+  </xsl:variable>
+
+  <xsl:variable name="targetptr">
+    <xsl:value-of 
+       select="substring-before(substring-after($olink.key, '/'), '/')"/>
+  </xsl:variable>
+
+  <xsl:variable name="target.lang">
+    <xsl:variable name="candidate">
+      <xsl:for-each select="$target.database" >
+        <xsl:value-of 
+                  select="key('targetptr-key', $olink.key)/@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="$olink.lang"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:if test="$current.docid = $targetdoc and 
+                $olink.lang = $target.lang">
+    <xsl:variable name="targets" select="key('id',$targetptr)"/>
+    <xsl:variable name="target" select="$targets[1]"/>
+    <xsl:if test="$target">
+      <xsl:value-of select="$targetptr"/>
+    </xsl:if>
+  </xsl:if>
+
+</xsl:template>
+
+
 <xsl:template name="olink.outline">
   <xsl:message terminate="yes">Fatal error: what is this supposed to do?</xsl:message>
 </xsl:template>