Subject: Re: [xsl] document function cached? From: Louis-Dominique Dubeau <ldd@xxxxxxxxxxxx> Date: Mon, 11 Feb 2013 11:27:53 -0500 |
On Mon, 2013-02-11 at 16:58 +0100, Michel Hendriksen wrote: > I would want to match against the position of the node within > the predicate, > like in position(current()). position() does not take a parameter; it already returns the position of the current node. Typically, the solution to foo[position()] is to figure out what position one cares about and save that into a variable and then have foo[$var]. > Its the context switch that makes it weird/meaningless to use > position() as I did. Yes, I think understanding the issue of context switches is really key here. I actually have a working example of a piece of code where it would be tempting to use foo[position()]. It transforms a table like: <table> <headings> <cell>Name</cell><cell>Exam number</cell><cell>Score</cell> </headings> <row><cell>Alice</cell><cell>001</cell><cell>100</cell></row> <row><cell>Bob</cell><cell>010</cell><cell>50</cell></row> </table> To: <list> <item>Name: Alice, Exam number: 001, Score: 100</item> <item>Name: Bob, Exam number: 010, Score: 50</item> </list> Basically, it takes the table and merges the column headings with the cell data of regular rows to form a list. The important template is this one: <xsl:template match="row/cell"> <xsl:variable name="col" select="position()"/> <!-- It is not possible to use position() instead of $col in the next select. --> <xsl:apply-templates select="../../headings/cell[$col]"/>: <xsl:apply-templates select="node()"/> <xsl:if test="following-sibling::*"> <xsl:text>, </xsl:text> </xsl:if> </xsl:template> One might be tempted to have cell[position()] in this statement: <xsl:apply-templates select="../../headings/cell[$col]"/> but this would be exactly the problem we've talked about. The solution is to save the position I care about in a variable and use the variable in the predicate. At the time the variable is declared, position() means what I want it to mean, i.e. the position of the cell element among all cell elements in the row. Complete code follows my signature. Louis <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <!-- Run this file with position2-data.xml. --> <xsl:output method="xml"/> <xsl:template match="row/cell"> <xsl:variable name="col" select="position()"/> <!-- It is not possible to use position() instead of $col in the next select. --> <xsl:apply-templates select="../../headings/cell[$col]"/>: <xsl:apply-templates select="node()"/> <xsl:if test="following-sibling::*"> <xsl:text>, </xsl:text> </xsl:if> </xsl:template> <xsl:template match="table"> <list> <xsl:apply-templates select="row"/> </list> </xsl:template> <xsl:template match="row"> <item> <xsl:apply-templates select="*"/> </item> </xsl:template> <xsl:template match="headings/cell"> <xsl:apply-templates select="node()"/> </xsl:template> <xsl:template match="node()"> <xsl:copy> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] document function cached?, Michel Hendriksen | Thread | Re: [xsl] document function cached?, Michael Kay |
Re: [xsl] document function cached?, Michel Hendriksen | Date | [xsl] XMLNS problem, Eric Harbeson |
Month |