xsl-list
[Top] [All Lists]

Re: grouping and context (?)

2004-08-27 17:52:13

On Aug 27, 2004, at 10:52 AM, David Carlisle wrote:

key() (as in xslt1) returns nodes only from the current document (where
temporary trees generated in xsl:variable count as new documents)
the solution is as in xslt1

save a variable holding a node in teh original document before you go
off somewhere else

<xsl:variable name="orig" select="/"/>

So where exactly am I putting this variable? At the top-level of my current stylesheet? Within the template?

then when you need to go back there use (in xslt2)

select="$orig/key('citekey', current()/@ID)"

I've tried a couple of variations on this, but I still get the same behavior, where:

<citation><biblioref linkend="doe99a"/></citation>
<citation><biblioref linkend="doe99a" begin="1" end="2"/></citation>

Yields:

(Doe, 1999: 1-2)
(Doe, 1999: 1-2)

Template as it exists now (the top-level element for the bib record would be <mods ID="doe99a">):

 <xsl:variable name="orig" select="/"/>

<!-- begin citation processing -->
<xsl:key name="citekey" match="db:biblioref" use="@linkend" />
<!-- author-year class processing -->
<xsl:template match="db:citation[$citation-class='author-year']">
  <xsl:variable name="idref" select="db:biblioref/@linkend"/>
<!-- use a key to access mods records based on lindend value -->
  <xsl:variable name="bibref" select="key('bibref', $idref)" />
  <xsl:value-of select="$citation-before"/>
<!-- group and sort by authors-string -->
  <xsl:for-each-group select="$bibref" group-by="bib:grouping-key(.)">
    <xsl:sort select="current-grouping-key()"/>
<!-- within an authors group, sort by year -->
    <xsl:for-each-group select="current-group()"
                        group-by="mods:year">
      <xsl:sort select="current-grouping-key()"/>
      <xsl:for-each select="current-group()">
<!-- since we're now working with the mods source, the only way
I can see to get back to the biblioref code is to use a key again;
unfortunately doesn't work correctly ** -->
        <xsl:variable name="citekey" select="key('citekey', @ID)" />
        <a href="#{(_at_)ID}">
          <xsl:if test="position() = 1">
            <xsl:choose>
              <xsl:when test="mods:name">
                <xsl:apply-templates select="mods:name" mode="citation"/>
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of select="mods:noname-substitute"/>
              </xsl:otherwise>
            </xsl:choose>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="mods:year"/>
          </xsl:if>
<!-- apply suffix if applicable -->
          <xsl:apply-templates select="mods:key"/>
<!-- render point citation details if present -->
          <xsl:for-each select="$orig/key('citekey', current()/@ID)">
          <xsl:if test="@begin">
            <xsl:value-of select="$point-cite-before"/>
            <xsl:value-of select="@begin" />
            <xsl:text>-</xsl:text>
            <xsl:choose>
              <xsl:when test="string-length(@begin) = 1">
                <xsl:value-of select="@end" />
              </xsl:when>
              <xsl:when test="string-length(@begin) = 2">
                <xsl:value-of select="substring(@end, 2, 1)" />
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of select="substring(@end, last() - 1)" />
              </xsl:otherwise>
            </xsl:choose>
          </xsl:if>
          </xsl:for-each>
          <xsl:if test="position() != last()">, </xsl:if>
        </a>
      </xsl:for-each>
    </xsl:for-each-group>
    <xsl:if test="position() != last()">; </xsl:if>
  </xsl:for-each-group>
  <xsl:value-of select="$citation-after"/>
</xsl:template>

Bruce



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