[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: parsing version number strings
Hi, > Has anyone out there come up with a method to parse an > arbitrary version > number string in an XSLT for numeric comparison? > > For example, I'm parsing some Doxygen output and I need to > apply different > templates based on which version of Doxygen produced the output. For > example, I have something that needs to be applied only to > versions 1.3.4 > and older. > > The version of Doxygen is stored in an attribute of the root <doxygen> > element: <doxygen version="1.3.4"> > > Here is a sequence of increasingly newer version numbers that > illustrates > some of the complexities of parsing this string: > > 1.2.9 > 1.2.10 > 1.2.10.1 > 1.3 > 1.3.1 > 1.3.2 > 1.3.2.1 > > There doesn't seem to be an XPath function that gives me the > position of a > character within a string, which kind of hamstrings me, as > far as I can > tell. > > Anyone solved this problem before? How about <xsl:template name="compare"> <xsl:param name="v1"/> <xsl:param name="v2"/> <xsl:variable name="n1"> <xsl:choose> <xsl:when test="contains($v1, '.')"> <xsl:value-of select="substring-before($v1, '.')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$v1"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="n2"> <xsl:choose> <xsl:when test="contains($v2, '.')"> <xsl:value-of select="substring-before($v2, '.')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$v2"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="string(number($n1)) = 'NaN' and string(number($n2)) = 'NaN'">0</xsl:when> <xsl:when test="string(number($n1)) = 'NaN'">-1</xsl:when> <xsl:when test="string(number($n2)) = 'NaN'">1</xsl:when> <xsl:when test="number($n1) = number($n2)"> <xsl:call-template name="compare"> <xsl:with-param name="v1" select="substring-after($v1, '.')"/> <xsl:with-param name="v2" select="substring-after($v2, '.')"/> </xsl:call-template> </xsl:when> <xsl:when test="$n1 < $n2">-1</xsl:when> <xsl:when test="$n1 > $n2">1</xsl:when> </xsl:choose> </xsl:template> which will return -1 if $v1 is less than $v2, 0 is they're equal, and 1 if $v1 is greater than $v2. Was that what you were after? Cheers, Jarno - Nick Rafferty: Live Mix
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|