Subject: RE: [xsl] XSL/XPath Dynamic sort key From: "Michael Kay" <mhk@xxxxxxxxx> Date: Thu, 10 Jul 2003 23:47:13 +0100 |
> I know I know, it's not possible. You're right. Well, almost. The select="*[name()=$param]" trick only works for single level "child element" selections. You can try stretching it to other cases, but it's going to get combinatorially difficult. I would go with one of the other possible approaches, which are: (a) generate the XPath expression dynamically, using xx:evaluate() if your processor offers this extension (b) generate (or modify) the stylesheet dynamically before you run it. Michael Kay Well I've got this line > working so far, > so I'm halfway through the "this is impossible in XSL" > process so far. > First some params, then some XSL. > > <xsl:param name="sort_select_lvl_1">author</xsl:param> > <xsl:param name="sort_select_lvl_2">/</xsl:param> > <xsl:param name="sort_select_lvl_3">last_name</xsl:param> > <xsl:param name="sort_order">ascending</xsl:param> > <xsl:param name="sort_data_type">text</xsl:param> > > <xsl:apply-templates select="document"> > <xsl:sort select="*[name()=$sort_select_lvl_1]" > data-type="{$sort_data_type}" order="{$sort_order}" /> > </xsl:apply-templates> > > > Now here's what I want. Sometimes I want to sort by uid, > accesses, which > works fine. Other times I want to sort by author/last_name. > Now I can do > this by changing the sort line to this... > > <xsl:sort > select="*[name()=$sort_select_lvl_1]\*[name()=$sort_select_lvl_2]" > data-type="{$sort_data_type}" order="{$sort_order}" /> > > But then it doesn't work for uid or accesses anymore because > the "\" at the > end of the string. If I remove the "\" i get a number > expected error. So > I've come up with half a way around it. I figure I will have lots of > variables at the top, lvl_1 through 4 so that I can fill them > all with parts > of an xpath statement and then join them togather. So I try it and > unfortunately xpath's concat does not let the sort select > evaluate the xpath > statement. In other words > > xsl:sort select="concat('author','/','last_name')" /> > is not the same as > <xsl:sort select="author/last_name" /> > > So how do I string togather the *[name()=$sort_select_lvl_1], > one directly > after the other? I set the defaults in the xslt above to reflect a > reference to "author/last_name". > > > Glimpse of XML > > <catalog> > <document> > <uid>2301</uid> > <url>http://www.who.com/document.htm</url> > <subject>General Stuff</subject> > <abstract>This is an abstractabstract> > <accesses>1</accesses> > <age>4</age> > <last_accessed date="20011229">12/29/2001</last_accessed> > <author> > <first_name>Peon</first_name> > <last_name>lover</last_name> > <serial>9A1551645</serial> > </author> > <owner> > <first_name>Jolly</first_name> > <last_name>Goose</last_name> > <serial>123456</serial> > </owner> > <manager> > <first_name>Someone</first_name> > <last_name>Special</last_name> > <serial>123456</serial> > </manager> > <supervisor> > <first_name>Someone</first_name> > <last_name>Important</last_name> > <serial>123456</serial> > </supervisor> > </document> > ... > </catalog> > > Thanks in advance! > > Aaron > > _________________________________________________________________ > Protect your PC - get McAfee.com VirusScan Online > http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963 > > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XSL/XPath Dynamic sort ke, David Carlisle | Thread | RE: [xsl] XSL/XPath Dynamic sort ke, Fett Boba |
RE: [xsl] 'qname' is not a valid XS, Michael Kay | Date | RE: [xsl] Using not(...a nd ... ) t, Michael Kay |
Month |