Subject: RE: [xsl] new: how to change value of attributes From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 25 Nov 2009 18:52:45 -0000 |
> <xsl:template match="mets:div/@LABEL[matches(., '^Pagina [0-9]+$')]"> > <xsl:variable name="n"> > <xsl:number level="any" count="mets:div[@LABEL[matches(., '^Pagina [0-9]+$')]]"/> > </xsl:variable> > <xsl:attribute name="LABEL" select="concat('Carta ', if ($n mod 2 = 0) then concat(($n + 1) idiv 2, 'v') else concat(($n + 1) idiv 2, 'r'))"/> > </xsl:template> > The redundancy of repeating the whole pattern is pretty horrible, both for performance and for maintenance. An idiom I have used in such cases is: <xsl:variable name="g" select="//mets:div[matches(@LABEL, '^Pagina [0-9]+$')]"/> <xsl:template match="*[. intersect $g]/@LABEL"> <xsl:variable name="n" select="f:index-of-node($g, .)"/> where <xsl:function name="f:index-of-node" as="xs:integer*"> <xsl:param name="nodes" as="node()*"/> <xsl:param name="node" as="node()"/> <xsl:for-each select="$nodes"> <xsl:sequence select="position()[current() is $node]"/> </xsl:for-each> </xsl:function> which still isn't ideal, but it feels a bit better. Regards, Michael Kay http://www.saxonica.com/ http://twitter.com/michaelhkay
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] new: how to change value , Martin Honnen | Thread | RE: [xsl] new: how to change value , Michael Kay |
[xsl] XSLT/XSL-FO: How to get a spe, Martin Jackson | Date | RE: [xsl] new: how to change value , Michael Kay |
Month |