Subject: Re: [xsl] Can a single XPath statement duplicate the functionality of this verbose <xsl:choose> statement? From: Andrew Welch <andrew.j.welch@xxxxxxxxx> Date: Mon, 24 Oct 2011 11:17:58 +0100 |
On 24 October 2011 01:10, Mark <mark@xxxxxxxxxxxx> wrote: > Although they do have the virtue of giving me my desired output, can the > following sequence of statements be replaced by a more generalized (shorter > and simpler) XPath statement without the repetitive "when" tests shown > below? > > <xsl:choose> > <xsl:when test="@souvenir-sheet"> > <xsl:copy-of select="if (../Location/@souvenir-sheet) then > ../Location/@souvenir-sheet else if (../Location/@denomination) then > ../Location/@denomination else '0' "/> > </xsl:when> > <xsl:when test="@minisheet"> > <xsl:copy-of select="if(../Location/@minisheet) then > ../Location/@minisheet else if(../Location/@denomination) then > ../Location/@denomination else '0'"/> > </xsl:when> > <xsl:when test="@booklet"> > <xsl:copy-of select="if(../Location/@booklet) then > ../Location/@booklet else if(../Location/@denomination) then > ../Location/@denomination else '0'"/> > </xsl:when> > <xsl:when test="@se-tenant"> > <xsl:copy-of select="if (../Location/@se-tenant) then > ../Location/@se-tenant else if(../Location/@denomination) then > ../Location/@denomination else '0'"/> > </xsl:when> > <xsl:when test="@coupon"> > <xsl:copy-of select=" if (../Location/@coupon) then > ../Location/@coupon else if(../Location/@denomination) then > ../Location/@denomination else '0'"/> > </xsl:when> > </xsl:choose> I would use templates for this, then its easier to maintain down the line: Apply templates to the attributes: <xsl:apply-templates select="@souvenir-sheet, @minisheet, @booklet"/> (if you only want to process the first that exists and not all them then use(@souvenir-sheet, @minisheet, @booklet)[1] then use 3 templates to cover the 3 conditions, using the priority attribute to control which gets matched: <xsl:template match="@souvenir-sheet[../Location/@souvenir-sheet]" priority="30"> <xsl:value-of select="../Location/@souvenir-sheet"/> </xsl:template> <xsl:template match="@souvenir-sheet[../Location/@denomination]" priority="20"> <xsl:value-of select="../Location/@denomination"/> </xsl:template> <xsl:template match="@souvenir-sheet" priority="10">0</xsl:template> Doing it that way instead of a single xpath should make it easier to follow and debug, you can add additional conditions without touching the existing code and you open up the code for overriding. -- Andrew Welch http://andrewjwelch.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Can a single XPath statem, Mark | Thread | Re: [xsl] Can a single XPath statem, Mark |
Re: [xsl] Can a single XPath statem, Mark | Date | Re: [xsl] Can a single XPath statem, Mark |
Month |