However, I've exposed another problem which I can't quite wrapped my
head around how to solve. I have this key at the top of the main
stylesheet:
<xsl:key name="citekey" match="db:biblioref/@linkend"
use="'all'" />
My problem (I think) is that I need this to apply this to the content
that I am xincluding, while my guess is the key is constructed before
it gets included in the temporary tree.
The key is applicable to any document (but only one at a time). The key()
function searches the document containing the context node, and you can
reasonably assume that the index will be constructed for a particular
document the first time it is used to search that document.
I don't really see what a key with a constant "use" expression achieves.
Apart from the fact that it applies to whichever document is current at the
time, you could just as well (and probably better) use a global variable
<xsl:variable name="citekey" select="//db:biblioref/@linkend"/>
What's more, I would probably replace:
<xsl:for-each select="distinct-values(key('citekey', 'all'))">
<xsl:if test="position() > 1">,%20</xsl:if>
<xsl:text>'</xsl:text>
<xsl:value-of select="."/>
<xsl:text>'</xsl:text>
</xsl:for-each>
with
<xsl:for-each-group select="//db:biblioref/@linkend" group-by=".">
<xsl:if test="position() > 1">,%20</xsl:if>
<xsl:text>'</xsl:text>
<xsl:value-of select="."/>
<xsl:text>'</xsl:text>
</xsl:for-each-group>
One reason is that for-each-group gives you more control over ordering in
the result than distinct-values (the order of the result of distinct-values
is implementation-defined).
Incidentally, the ' could just as well be written '.
However, I don't understand the problem well enough to know which document
you are trying to search at this point.
Michael Kay
http://www.saxonica.com/
Below is my entire driver file. Help would, as always, be much
appreciated.
Bruce
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:db="http://docbook.org/docbook-ng"
xmlns:mods="http://www.loc.gov/mods/v3"
xmlns:bib="http://xbiblio.sourceforge.net"
xmlns="http://docbook.org/docbook-ng"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:exist="http://exist.sourceforge.net/NS/exist"
exclude-result-prefixes="mods bib db xs">
<!--
This driver file creates a temporary tree of the document for
subsequent processing. In the case of footnote class
citations, this means wrapping all citations in a footnote
element.
-->
<!--+
==============================================================
| first, create a temporary tree that adds raw bib data
to document
| based on unique citation keys, and any xincluded docs
+-->
<xsl:key name="citekey" match="db:biblioref/@linkend"
use="'all'" />
<xsl:template match="/">
<xsl:variable name="temp">
<xsl:apply-templates mode="resolve-linked-docs" />
</xsl:variable>
<xsl:apply-templates select="$temp" mode="step-2" />
</xsl:template>
<xsl:template match="db:article" mode="resolve-linked-docs">
<article>
<xsl:apply-templates mode="resolve-linked-docs" />
</article>
</xsl:template>
<xsl:template match="db:book" mode="resolve-linked-docs">
<book>
<xsl:apply-templates mode="resolve-linked-docs" />
</book>
</xsl:template>
<xsl:template match="db:chapter" mode="resolve-linked-docs">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="db:info" mode="resolve-linked-docs">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="db:section" mode="resolve-linked-docs">
<xsl:copy-of select="."/>
</xsl:template>
<!--+
==============================================================
| resolve xincludes
+-->
<xsl:template match="xi:include" mode="resolve-linked-docs">
<xsl:copy-of select="document(@href)" />
</xsl:template>
<xsl:template match="db:bibliography" mode="resolve-linked-docs">
<xsl:variable name="citekeys">
<xsl:text>(</xsl:text>
<xsl:for-each select="distinct-values(key('citekey', 'all'))">
<xsl:if test="position() > 1">,%20</xsl:if>
<xsl:text>'</xsl:text>
<xsl:value-of select="."/>
<xsl:text>'</xsl:text>
</xsl:for-each>
<xsl:text>)</xsl:text>
</xsl:variable>
<!--+
==============================================================
| bibrecord variable identifies where to locate the bib
records; in
| this case, we access them via http from an eXist XML DB
+-->
<xsl:variable name="bibrecord"
select='doc(concat("http://localhost:8080/exist/servlet/db/biblio?",
"_query=declare%20namespace%20mods=%22http://www.loc.gov/mods/v3%22;",
"%20for%20$citekey%20in%20",
$citekeys,
"%20return%20/mods:modsCollection/mods:mods[(_at_)ID=$citekey]"))' />
<bibliography>
<modsCollection xmlns="http://www.loc.gov/mods/v3">
<xsl:copy-of select="$bibrecord/exist:result/mods:mods" />
</modsCollection>
</bibliography>
</xsl:template>
<!--+
==============================================================
| next, take that temporary tree and enhance it for subsequent
processing
+-->
<xsl:template match="/" mode="step-2">
<xsl:variable name="temp">
<xsl:apply-templates mode="enhanced-bib" />
</xsl:variable>
<xsl:apply-templates select="$temp" mode="modified" />
</xsl:template>
<xsl:template match="db:article" mode="enhanced-bib">
<article>
<xsl:apply-templates mode="enhanced-bib" />
</article>
</xsl:template>
<xsl:template match="db:book" mode="enhanced-bib">
<book>
<xsl:apply-templates mode="enhanced-bib" />
</book>
</xsl:template>
<xsl:template match="db:chapter" mode="enhanced-bib">
<chapter>
<xsl:apply-templates mode="enhanced-bib" />
</chapter>
</xsl:template>
<xsl:template match="db:info" mode="enhanced-bib">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="db:section[$citation-class='author-year']"
mode="enhanced-bib">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="db:bibliography" mode="enhanced-bib">
<bibliography>
<xsl:apply-templates select="mods:modsCollection"
mode="enhanced-bib"/>
</bibliography>
</xsl:template>
<xsl:template match="db:section[$citation-class='note']"
mode="enhanced-bib">
<section>
<xsl:apply-templates mode="enhanced-bib"/>
</section>
</xsl:template>
<xsl:template match="db:section[$citation-class='note']/db:info"
mode="enhanced-bib">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="db:footnote[$citation-class='note']"
mode="enhanced-bib">
<footnote>
<xsl:apply-templates mode="enhanced-bib"/>
</footnote>
</xsl:template>
<xsl:template match="db:section/db:para[$citation-class='note']"
mode="enhanced-bib">
<para>
<xsl:apply-templates mode="enhanced-bib"/>
</para>
</xsl:template>
<xsl:template match="db:footnote/db:para[$citation-class='note']"
mode="enhanced-bib">
<para>
<xsl:apply-templates mode="enhanced-bib"/>
</para>
</xsl:template>
<xsl:template match="db:citation[$citation-class='note']"
mode="enhanced-bib">
<!--+
==============================================================
| with footnote class citations, wrap all citations in a
footnote,
unless
| already in a footnote
+-->
<xsl:choose>
<xsl:when test="ancestor::db:footnote">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise>
<footnote>
<xsl:copy-of select="."/>
</footnote>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--