This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


--- "Carter, Will" <WCarter at envestnetpmc dot com> 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

Hi Will,

Here's a solution, which even does *not* need to produce an
intermediary output in an RTF:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:template match="/">
    <xsl:variable name="firstRoot" select="."/>
    <xsl:for-each select="document('person2.xml')/people/person">
      <xsl:sort select="turtle"/>
      person: <xsl:value-of select="@name"/>
      <xsl:text>&#xA;</xsl:text>
      <xsl:for-each select="$firstRoot/people/person[@name =
current()/@name]/*">
        <xsl:value-of select="concat(., ' ')"/>
      </xsl:for-each>
      <xsl:for-each select="*">
        <xsl:value-of select="concat(., ' ')"/>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

When applied to your source xml document, the result is:


      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 



=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

__________________________________________________
Do you Yahoo!?
Yahoo! News - Today's headlines
http://news.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]