[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: sorting on data referenced with document()??

Subject: RE: sorting on data referenced with document()??
From: "Carter, Will" <WCarter@xxxxxxxxxxxxxxxx>
Date: Tue, 17 Sep 2002 20:27:51 -0500
xsl for each select document
hmm...

I figured that I would first try the extension function route, but I can't quite figure out how to get it working.  Excuse my ignorance, I am a xslt beginner and I have never added a.

anyway, I tried to first download the function itself:
http://www.exslt.org/exsl/functions/node-set/exsl.node-set.zip

but inside the zip, exsl.node-set.xsl isn't present.????

the only way I could get exsl.node-set.xsl in any manner is to download the all modules zip. 
http://www.exslt.org/all-exslt.zip
exsl.node-set.1.xsl and exsl.node-set.2.xsl are in that zip, so I am guessing that those are what I need.
I put these 2 xsl files in the same folder as my two.xsl

so I try to modify my stylesheet:
------------------------------------------------------
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:common="http://exslt.org/common" xmlns="http://www.w3.org/tr/REC-html40" version="1.0">
<xsl:import href="exsl.node-set.1.xsl" />
<xsl:import href="exsl.node-set.2.xsl" />
------------------------------------------------------

I add the variable as instructed (i hope this is right):
------------------------------------------------------
<xsl:variable name="persons">
   <xsl:for-each select="people/person">
     <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:copy-of select="*"/>
       <xsl:variable name="ownerName" select="@name"/>
       <xsl:for-each select="document('xml2.xml')">
         <xsl:copy-of select="key('turtleByOwner', $ownerName)"/>
       </xsl:for-each>
     </xsl:copy>
   </xsl:for-each>
</xsl:variable>
------------------------------------------------------

and I change the for each in the stylesheet to:
------------------------------------------------------
<xsl:for-each select="exsl:node-set($persons)/person">
------------------------------------------------------

I try to transform with xalan at my command line and I get:
------------------------------------------------------
java org.apache.xalan.xslt.Process -in xml1.xml -xsl two.xsl -out 2.html
file:///C:/xsl/two.xsl; Line 25; Column 57; XSLT Error (javax.xml.transform.Tran
sformerConfigurationException): javax.xml.transform.TransformerException: javax.
xml.transform.TransformerException: Prefix must resolve to a namespace: exslt
------------------------------------------------------

what am I doing wrong?
will

-----Original Message-----
From: Joerg Heinicke [mailto:joerg.heinicke@xxxxxx]
Sent: Monday, September 16, 2002 7:40 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re:  sorting on data referenced with document()??


Hello Will,

you either have to statically change the context to the second document

<xsl:for-each select="document('xml2.xml')/people/person">
   <xsl:sort select="turtle"/>
   ...
</xsl:for-each>

(but I think that's not an option)

or you have to create a temporary tree with all information merged. You 
can do this either via a 2 transformations or using an extension 
function exslt:node-set(). While extension functions always have the 
disadvantage of less portability, exslt is an approach against that 
matter (http://www.exslt.org).

<xsl:variable name="persons">
   <xsl:for-each select="people/person">
     <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:copy-of select="*"/>
       <xsl:variable name="ownerName" select="@name"/>
       <xsl:for-each select="document('xml2.xml')">
         <xsl:copy-of select="key('turtleByOwner', $ownerName)"
       </xsl:for-each>
       <xsl:copy-of select="
     </xsl:copy>
   </xsl:for-each>
</xsl:variable>

<xsl:for-each select="exslt:node-set($persons)/person">
   <xsl:sort select="cat"/> <!-- or turtle -->
   ...
</xsl:for-each>

Other comments to your stylesheet:

Are you sure you want version="2.0"??
In the match attribute of the key, you don't need //. The key indexes 
the whole XML tree (so all turtle elements, even without //).

Regards,

Joerg

Carter, Will wrote:
> Hi,
> 
> I have a sorting problem when I use xsl to combine data from 2 xml files into one html output.
> 
> here is my xml file 1 (xml1.xml):
> -----------------------
> <people>
> 	<person name="george">
> 		<cat>cat-zoro</cat>
> 		<dog>dog-butch</dog>
> 		<fish>fish-jaws</fish>
> 	</person>
> 	<person name="jennifer">
> 		<cat>cat-felix</cat>
> 		<dog>dog-fido</dog>
> 		<fish>fish-moby</fish>
> 	</person>
> 	<person name="simon">
> 		<cat>cat-tom</cat>
> 		<dog>dog-scooby</dog>
> 		<fish>fish-conroy</fish>
> 	</person>
> </people>
> -----------------------
> 
> here is my xml file 2 (xml2.xml):
> -----------------------
> <people>
> 	<person name="george">
> 		<turtle>turtle-greeny</turtle>
> 	</person>
> 	<person name="jennifer">
> 		<turtle>turtle-browny</turtle>
> 	</person>
> 	<person name="simon">
> 		<turtle>turtle-red</turtle>
> 	</person>
> </people>
> -----------------------
> 
> here is my stylesheet:
> -----------------------
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/tr/REC-html40" version="2.0">
> <xsl:key name="turtleByOwner" match="//turtle" use="../@name" />
> <xsl:template match="/">
> <table border="1" cellspacing="0" cellpadding="0">
> 	<xsl:for-each select="people/person">
> 	<xsl:sort select="cat"/>
> 	<tr>
> 		<td colspan="7">Person: <xsl:value-of select="@name"/></td>
> 	</tr>
> 	<tr>
> 		<td><xsl:value-of select="cat"/></td>
> 		<td><xsl:value-of select="dog"/></td>
> 		<td><xsl:value-of select="fish"/></td>
> 		<xsl:variable name="ownerName" select="@name"/>
> 		<td>
> 		<xsl:for-each select="document('xml2.xml')">
> 		<xsl:value-of select="key('turtleByOwner', $ownerName)"
> 		</xsl:for-each>
> 		</td>
> 	</tr>
> 	</xsl:for-each>
> </table>
> </xsl:template>
> </xsl:stylesheet>
> -----------------------
> 
> this correctly produces (sorted by cat):
> -----------------------
> Person: jennifer 
> cat-felix   dog-fido   fish-moby   turtle-browny 
>   
> Person: simon 
> cat-tom   dog-scooby   fish-conroy   turtle-red 
>   
> Person: george 
> cat-zoro   dog-butch   fish-jaws   turtle-greeny 
> -----------------------
> 
> 
> but I want to sort by turtle (I want this output):
> -----------------------
> Person: jennifer 
> cat-felix   dog-fido   fish-moby   turtle-browny 
> 
> Person: george 
> cat-zoro   dog-butch   fish-jaws   turtle-greeny 
>  
> Person: simon 
> cat-tom   dog-scooby   fish-conroy   turtle-red 
> -----------------------
> 
> I changed the sort line to be:
> <xsl:sort select="turtle"/>
> but it doesn't work, my output is:
> -----------------------
> Person: george 
> cat-zoro   dog-butch   fish-jaws   turtle-greeny 
>   
> Person: jennifer 
> cat-felix   dog-fido   fish-moby   turtle-browny 
>   
> Person: simon 
> cat-tom   dog-scooby   fish-conroy   turtle-red 
> -----------------------
> 
> how can I sort on the turtle column from the document reference?
> 
> thanks for any ideas.
> will


 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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.