[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: C++ const and virtual methods
I asked a question about a week ago concerning C++ const and virtual methods where the existing stylesheets put all modifiers before the method name. As I received no response I decided to go ahead and start to learn xsl to fix the problem. And the result is shown below. Is there a nicer way than that in the elementpos template below of finding the position of an element within it's parent? <!-- Find the position of the specified element. --> <xsl:template name="elementpos"> <xsl:param name="ename"/> <xsl:choose> <xsl:when test="name(child::*[1]) = $ename">1</xsl:when> <xsl:when test="name(child::*[2]) = $ename">2</xsl:when> <xsl:when test="name(child::*[3]) = $ename">3</xsl:when> <xsl:when test="name(child::*[4]) = $ename">4</xsl:when> <xsl:when test="name(child::*[5]) = $ename">5</xsl:when> <xsl:when test="name(child::*[6]) = $ename">6</xsl:when> <xsl:when test="name(child::*[7]) = $ename">7</xsl:when> <xsl:when test="name(child::*[8]) = $ename">8</xsl:when> <xsl:when test="name(child::*[9]) = $ename">9</xsl:when> <xsl:when test="name(child::*[10]) = $ename">10</xsl:when> <xsl:otherwise>9999</xsl:otherwise> </xsl:choose> </xsl:template> <!-- Create copy of modifier template with new mode to insert a space before the modifier not after as in original --> <xsl:template match="modifier" mode="cpp-spacebefore"> <span class="{name(.)}"> <xsl:text> </xsl:text> <xsl:apply-templates mode="cpp"/> </span> </xsl:template> <!-- Change synopsis to place modifiers which appear after the methodname at the end This is to handle const methods and virtual methods i.e. '= 0' in c++. --> <xsl:template mode="cpp" match="constructorsynopsis|destructorsynopsis|methodsynopsis"> <xsl:variable name="pos"> <xsl:call-template name="elementpos"> <xsl:with-param name="ename" select="'methodname'"/> </xsl:call-template> </xsl:variable> <xsl:variable name="modifiers" select="child::*[name(.) = 'modifier' and position() < $pos]"/> <xsl:variable name="postmodifiers" select="child::*[name(.) = 'modifier' and position() > $pos]"/> <xsl:variable name="notmod" select="*[name(.) != 'modifier']"/> <xsl:variable name="decl"> <xsl:if test="parent::classsynopsis"> <xsl:text>  </xsl:text> </xsl:if> <xsl:apply-templates select="$modifiers" mode="cpp"/> <!-- type --> <xsl:if test="name($notmod[1]) != 'methodname'"> <xsl:apply-templates select="$notmod[1]" mode="cpp"/> </xsl:if> <xsl:apply-templates select="methodname" mode="cpp"/> </xsl:variable> <code class="{name(.)}"> <xsl:copy-of select="$decl"/> <xsl:text>(</xsl:text> <xsl:apply-templates select="methodparam" mode="cpp"> <xsl:with-param name="indent" select="string-length($decl)"/> </xsl:apply-templates> <xsl:text>)</xsl:text> <xsl:apply-templates select="$postmodifiers" mode="cpp-spacebefore"/> <xsl:if test="exceptionname"> <br/> <xsl:text>    throws </xsl:text> <xsl:apply-templates select="exceptionname" mode="cpp"/> </xsl:if> <xsl:text>;</xsl:text> </code> <xsl:call-template name="synop-break"/> </xsl:template> Regards Simon Kennedy ___________________________________________________________ How much free photo storage do you get? Store your holiday snaps for FREE with Yahoo! Photos http://uk.photos.yahoo.com
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]