<!-- Returns true iff the node is a nonempty text node or a span element -->
<func:function name='f:node-is-span'>
<xsl:param name='node' select='.' />
- <func:result test='( $node/self::text() and normalize-text($node) )
- or f:element-is-span($node)' />
+ <func:result select='( $node/self::text() and normalize-text($node) )
+ or f:element-is-span($node)' />
+</func:function>
+
+<!-- Remove leading whitespace from a string -->
+<func:function name='f:strip-leading'>
+ <xsl:param name='str' select='.' />
+ <xsl:param name='curlen' select='string-length($str)' />
+
+ <xsl:variable name='a' select='substring($str, 1, $curlen)' />
+ <xsl:variable name='b' select='substring($str, 1+$curlen)' />
+
+ <xsl:choose>
+ <xsl:when test='2 > $curlen'>
+ <func:result select='concat(normalize-space($a), $b)' />
+ </xsl:when>
+ <xsl:when test='normalize-space($a) = ""'>
+ <func:result select='f:strip-leading($b)' />
+ </xsl:when>
+ <xsl:otherwise>
+ <func:result select='f:strip-leading($str, ceiling($curlen div 2))' />
+ </xsl:otherwise>
+ </xsl:choose>
+</func:function>
+
+<!-- Remove trailing whitespace from a string -->
+<func:function name='f:strip-trailing'>
+ <xsl:param name='str' select='.' />
+ <xsl:param name='curlen' select='string-length($str)' />
+
+ <xsl:variable name='split' select='string-length($str) - $curlen' />
+ <xsl:variable name='a' select='substring($str, 1, $split)' />
+ <xsl:variable name='b' select='substring($str, 1+$split)' />
+
+ <xsl:choose>
+ <xsl:when test='2 > $curlen'>
+ <func:result select='concat($a, normalize-space($b))' />
+ </xsl:when>
+ <xsl:when test='normalize-space($b) = ""'>
+ <func:result select='f:strip-trailing($a)' />
+ </xsl:when>
+ <xsl:otherwise>
+ <func:result select='f:strip-trailing($str, ceiling($curlen div 2))' />
+ </xsl:otherwise>
+ </xsl:choose>
</func:function>
</xsl:stylesheet>