******************************************************************** -->
+<!-- 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">