[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Edit text-nodes with XSLT 2.0


Subject: Re: [xsl] Edit text-nodes with XSLT 2.0
From: Evan Lenz <evan@xxxxxxxxxxxx>
Date: Fri, 07 Apr 2006 15:47:58 -0700

Michael Kay wrote:
<xsl:template match="text()"> <!-- in the text node the
replacement of characters with font tags is done-->
<xsl:choose>
<xsl:when test="not(string(.))" />
<!-- test if
textcontent is empty -->
<xsl:otherwise>
<xsl:call-template name="find_char1" >
Some more stuff ...
</xsl:otherwise> <!-- end textcontent is not empty
-->
</xsl:choose>
</xsl:template>

Incidentally, when I see a template rule whose body consists entirely of an xsl:choose, my preference is always to split it into one rule for each branch of the choose:

<xsl:template match="text()[not(string(.))]"/>

<xsl:template match="text()[string(.)]">
  <xsl:call-template name="find_char1"  >
  Some more stuff ...
</xsl:template>

This would also fix the priorities..
Except in this case string(.) is always going to return true for a text node, so the other rule will never get invoked. (You can't have an empty text node.) The simplification here should just be to replace the whole xsl:choose instruction with what is currently the contents of xsl:otherwise:

<xsl:template match="text()">
 <xsl:call-template name="find_char1">
 Some more stuff ...
</xsl:template>

Then add something like priority="1". Perversely, you could also change the pattern just to get a higher default priority, like text()[true()]. I wouldn't recommend that of course, but text()[string(.)] is effectively the same thing, so that's what made me think of it :-)

Alternatively, you could modify the original rule so that it doesn't apply to text nodes:

<xsl:template match="@* | * | comment() | processing-instruction()">
 <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

But I do completely agree with Michael's point, which is to favor template rules over explicit conditionals when possible :-)

Evan


Current Thread