Subject: [xsl] learned a lesson about XPath variable evaluations sorting in document order From: "Chris Papademetrious christopher.papademetrious@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 16 Feb 2023 23:34:01 -0000 |
Hi everyone, Given the following input: <?xml version="1.0" encoding="utf-8" ?> <root> <data>1</data> <group> <data>2</data> <group> <data>3</data> <results> <!-- put ancestor <data> values here, closest first --> </results> </group> </group> </root> I wanted the lowest-level <results> element to contain all the ancestor <data> values, in order of closest ancestor first. By applying reverse() to the ancestor results, this gives the desired results of "321": <xsl:template match="results"> <!-- summarize <data> --> <xsl:variable name="all-data" as="text()*" select="reverse(ancestor::*/data/text())"/> <xsl:copy> <xsl:value-of select="$all-data"/> </xsl:copy> </xsl:template> But if I move the text() evaluation from the <xsl:variable> to the <xsl:value-of>, then I get "123" instead: <xsl:template match="results"> <!-- summarize <data> --> <xsl:variable name="all-data" as="element()*" select="reverse(ancestor::*/data)"/> <xsl:copy> <xsl:value-of select="$all-data/text()"/> </xsl:copy> </xsl:template> The cause is that the "/" in "$all-data/text()" XPath expression causes the results to be sorted in document order. Somehow I thought that once the elements were in the variable, they became disassociated with the source document. But apparently they're not, which updates my mental model. If I change "/" to the "!" operator (apply an operation to each item in a sequence), then I get "321" again because the reversed ancestor order is preserved: <xsl:value-of select="$all-data ! text()"/> Anyway, just passing this along as a friendly reminder to the other novices on the list. I spent more time than I'd like to admit figuring this out on my more complicated stylesheet. * Chris P.S. MANY thanks to Martin for enabling me to fiddle my way to understanding! ----- Chris Papademetrious Tech Writer, Implementation Group (610) 628-9718 home office (570) 460-6078 cell
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Re: Regular expression to exc, Eliot Kimber eliot.k | Thread | Re: [xsl] learned a lesson about XP, Michael Kay mike@xxx |
Re: Followup question: was Re: [xsl, Liam R. E. Quin liam | Date | Re: Followup question: was Re: [xsl, ohaya ohaya@xxxxxxxx |
Month |