Here is a more efficient solution O (N) vs O (N ^ 2) for the accepted answer :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="text()" name="skipAfterDots"> <xsl:param name="pTotalString" select="."/> <xsl:param name="pTotalLength" select="string-length(.)"/> <xsl:param name="pPosition" select="1"/> <xsl:param name="pLastFound" select="-1"/> <xsl:choose> <xsl:when test="$pPosition > $pTotalLength"> <xsl:value-of select="substring($pTotalString, $pLastFound + 1)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="vIsDot" select= "substring($pTotalString, $pPosition, 1) = '.'"/> <xsl:call-template name="skipAfterDots"> <xsl:with-param name="pTotalString" select="$pTotalString"/> <xsl:with-param name="pTotalLength" select="$pTotalLength"/> <xsl:with-param name="pLastFound" select= "$pLastFound * not($vIsDot) + $pPosition * $vIsDot"/> <xsl:with-param name="pPosition" select="$pPosition+1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
When this conversion is applied to the following XML document :
<t>M:Namespace.Class.Method(Something a, Something b)</t>
required, the correct result is obtained :
Method(Something a, Something b)
Explanation
This solution does not contain a call to the substring-after() function . Instead, at each step, only one line character is compared for equality with a period character. Since no more than N characters, this is O (N) - linear complexity.
In contrast, the accepted answer calls the substring-after() function at each step . In the worst case, there may be N points, and thus it will be O (N ^ N) - quadratic complexity.
Note We make a reasonable assumption that in both solutions the search for the kth character of the string is O (1).
Dimitre novatchev
source share