Subject: RE: Selecting last text() from fragment of unknown depth?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 5 Feb 2005 16:53:01 -0000
|
> With this template
>
> <xsl:template
> match="submission.excerpt//node()/@*|submission.excerpt//node()">
> <xsl:copy><xsl:apply-templates select="./@*|./node()" /></xsl:copy>
> </xsl:template>
>
> have I made it impossible to also transform (inline) the last
> occurring
> textnode beneath submission.excerpt/node()?
Nothing is impossible, but selecting whether you're the last text node in a
subtree is a little tricky in 1.0. I often find it useful to work back from
a 2.0 solution, which you could do by adding the template rule:
<xsl:template match="text()[. is
(ancestor::submission.excerpt//text())[last()]]" priority="5"
<xsl:value-of select="."/>...
</xsl:template>
You haven't got the "is" operator in 1.0, but you can replace (A is B) by
(generate-id(A) = generate-id(B)).
This solution could be rather expensive if the number of text nodes in a
submission.excerpt is large.
Michael Kay
http://www.saxonica.com/
>
> So far all my recursion attempts (looking for
> node()[last()][self::text()]
> at each level) have yielded 3 variations: *only* the last
> text(), everything
> *except* the last text(), or the whole thing and then the last text()
> appended again.
>
> <xsl:choose>
> <xsl:when test="./node()[last()][self::text()]">
> <xsl:copy>
> <xsl:apply-templates
> select="./@*|./node()[position() != last()]" />
> <xsl:value-of select="./node()[last()]" />...
> </xsl:copy>
> </xsl:when>
> <xsl:otherwise>
> <!-- look again next level, etc -->
> </xsl:otherwise>
> </xsl:choose>
>
> It's meant to take an XHTML string (truncated from db then
> made well-formed
> again by PHP5's loadHTML method) and replace the end of the
> last text() --
> after the last occuring space character -- with an ellipsis,
> which I've now
> heard 3x is 'impossible' in XSLT 1.0 but it's not official
> till I've heard
> it here.
>
> Undying gratitude,
> -Adam.
>
> _________________________________________________________________
> Take advantage of powerful junk e-mail filters built on
> patented MicrosoftR
> SmartScreen Technology.
> http://join.msn.com/?pgmarket=en-ca&page=byoa/prem&xAPID=1994&
> DI=1034&SU=http://hotmail.com/enca&HL=Market_MSNIS_Taglines
> Start enjoying all the benefits of MSNR Premium right now
> and get the
> first two months FREE*.
|