xsl-list
[Top] [All Lists]

RE: navigation, TEI

2004-06-22 23:22:01
Hi,

I'm working on extending the TEI xsl stylesheet set with a more
complex 'prev-next' navigation bar. For the linking i need two
parameters: the text of the link, and the id of the link.
I use a template to get the appropriate node:

<xsl:template name="getPrev">
  <xsl:variable name="nodeSet">
    <xsl:text>self::div0 | self::div1 | self::div2 | 
self::div3 | self::div4</xsl:text>
  </xsl:variable>

Here you're binding $nodeSet to a Result Tree Fragment and…
 
  <xsl:choose>
    <xsl:when test="(preceding-sibling::*[$nodeSet]/head)[last()]">

… here if will always return true. Either copy/paste the $nodeSet text into 
every place where it's used or use an entity instead of a variable.

      <xsl:copy-of select="preceding::*[$nodeSet]/head[last()]" />
    </xsl:when>
    <xsl:when test="(ancestor::*[$nodeSet]/head)[last()]">
      <xsl:copy-of select="ancestor::*[$nodeSet]/head[last()]" />

Note here that the test pattern and the copy expression do not select/match the 
same nodes, just like in the previous when block if the axes were the same.

    </xsl:when>
    <xsl:otherwise></xsl:otherwise>
  </xsl:choose>
</xsl:template>

and i call this with:
<xsl:variable name="previous">
  <xsl:call-template name="getPrev" />
</xsl:variable>

And again, you're binding $previous to a RTF.

but as i would like to get the id of the node the following 
code doesn't work:

  <xsl:variable name="previousID">
    <xsl:value-of select="generate-id( $previous )" />
  </xsl:variable>

with the xsl processor saying: 'generate-id() : invalid arg 
expecting a node-set'
So i have to write another template (getPrevID) with the only 
difference of the selection:
  'select="generate-id( ... )"'

and the xpath expression
  (preceding-sibling::*[$nodeSet]/head)[last()]
is the same than this:
  (preceding-sibling::*/head)[last()]
the $nodeSet variable doesn't work at this situation.

How about

  <xsl:template name="getPrevID">
    <xsl:choose>
      <!--here you don't need to test for the last, because it will be true 
even if you have just one div# head -->
      <xsl:when test="preceding-sibling::*[self::div0 | self::div1 | self::div2 
| self::div3 | self::div4]/head">
        <xsl:value-of select="generate-id(preceding::*[self::div0 | self::div1 
| self::div2 | self::div3 | self::div4]/head[last()])" />
      </xsl:when>
      <xsl:when test="ancestor::*[self::div0 | self::div1 | self::div2 | 
self::div3 | self::div4]/head">
        <xsl:value-of select="generate-id(ancestor::*[self::div0 | self::div1 | 
self::div2 | self::div3 | self::div4]/head[last()])" />
      </xsl:when>
    </xsl:choose>
  </xsl:template>

Cheers,

Jarno - Cenobita: Slaves
<Prev in Thread] Current Thread [Next in Thread>