xsl-list
[Top] [All Lists]

xinclude, temp trees, and keys

2004-11-20 09:24:38

On Nov 20, 2004, at 3:48 AM, Michael Kay wrote:

You could either (a) use the document function rather than doc - document().

I did that, and it now works.  Thanks.

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.

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() &gt; 1">,%20</xsl:if>
         <xsl:text>&apos;</xsl:text>
         <xsl:value-of select="."/>
         <xsl:text>&apos;</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>
--~--



<Prev in Thread] Current Thread [Next in Thread>