RE: [xsl] Unexpected sort order on a multi sort

Subject: RE: [xsl] Unexpected sort order on a multi sort
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Thu, 21 Aug 2003 23:23:38 +0100
> I am sure I am missing an obvious one here,

Yep. xsl:sort data-type="number". 

Michael Kay

 but I am getting 
> unexpected output, based on the sort order.  I stripped my 
> XML down to the bare minimum here for an example.
> 
> Output
> SUBJECTS, Exp Var.Pos 172, Exp Var.Pos 202, Exp Var.Pos 236, 
> Exp Var.Pos 316, Exp Var.Pos 68 PA126746586, C/G, C/C, G/A, T/T, G/G
> 
> Expected the last variant to be the first based on sorting, 
> since <position> element is a number, shouldn't it be 68, 
> 172, 202, 236, 316?
> 
> Do I have a strange typo?  I added the number() function as a 
> last stab, but I was getting the same results without it?  
> What did I miss!
> 
> 
> Short XML DOC
> <?xml version="1.0" encoding="UTF-8"?>
> <pharmgkb xmlns="http://www.pharmgkb.org/schema/"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
> xsi:schemaLocation="http://www.pharmgkb.org/schema/ 
> http://www.pharmgkb.org/schema/root.xsd";>
> 	<gene pharmgkbId="PA117">
> 		<referenceSequence>
> 			
> <dnaSequence>ccagTAAGCGCCCTCCTAATCCCCGCAGCGCCACC</dnaSequence>
> 			<experiment>
> 				<sampleSetXref 
> resource="PharmGKB">PA128747821</sampleSetXref>
> 				<genotypesInSubject>
> 					<subjectXref 
> resource="PharmGKB">PA126746586</subjectXref>
> 					<pcrResult>
> 						<assayXref 
> resource="local">21</assayXref>
> 						
> <sequencedBothStrands>true</sequencedBothStrands>
> 						<variant>
> 							
> <position>202</position>
> 							
> <firstAllele>C</firstAllele>
> 							
> <secondAllele>C</secondAllele>
> 						</variant>
> 						<variant>
> 							
> <position>68</position>
> 							
> <firstAllele>G</firstAllele>
> 							
> <secondAllele>G</secondAllele>
> 						</variant>
> 						<variant>
> 							
> <position>172</position>
> 							
> <firstAllele>C</firstAllele>
> 							
> <secondAllele>G</secondAllele>
> 						</variant>
> 						<variant>
> 							
> <position>236</position>
> 							
> <firstAllele>G</firstAllele>
> 							
> <secondAllele>A</secondAllele>
> 						</variant>
> 						<variant>
> 							
> <position>316</position>
> 							
> <firstAllele>T</firstAllele>
> 							
> <secondAllele>T</secondAllele>
> 						</variant>
> 					</pcrResult>
> 				</genotypesInSubject>
> 			</experiment>
> 		</referenceSequence>
> 	</gene>
> </pharmgkb>
> 
> XSL
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
> xmlns:n1="http://www.pharmgkb.org/schema/"; 
> xmlns:sch="http://www.ascc.net/xml/schematron"; 
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
> 	<xsl:output method="text" indent="yes"/>
> 	<!--index all the subject elements in doc by value of 
> subjectXref-->
> 	<xsl:key name="subject-key" match="//n1:subjectXref" use="."/>
> 	<xsl:template match="/">
> 		<!--get unique subjects -->
> 		<xsl:variable name="unique-subjects" 
> select="//n1:subjectXref[generate-id(.)=generate-id(key('subje
> ct-key', .))]"/>
> 		<!--loop on unique subjects-->
> 		<xsl:for-each select="$unique-subjects">
> 			<!--sort the subjects -->
> 			<xsl:sort select="."/>
> 			<xsl:if test="position()=1" >
> 				<xsl:call-template 
> name="procSubjectHeader"/>
> 			</xsl:if>
> 			<xsl:call-template name="procSubject"/>
> 		</xsl:for-each>
> 	</xsl:template>
> 	
> 	<xsl:template name="procSubjectHeader">
> 		<xsl:variable name="subjectID" select="."/>
> 		<!--Column name for the subjects -->
> 		<xsl:text>SUBJECTS</xsl:text>
> 		<!--get list of all variants for the subject -->
> 		<xsl:variable name="subject-variants" 
> select="//n1:variant[../../n1:subjectXref=$subjectID]"/>
> 		<xsl:for-each select="$subject-variants">
> 			<!--Sort on all variants on experiment-->
> 			<xsl:sort select="../../.."/>
> 			<!--Sort on all variant position-->
> 			<xsl:sort select="number(n1:position)"/>
> 			<xsl:call-template name="procVariantHeader"/>
> 		</xsl:for-each>
> 		<!-- Output carriage return after all subject 
> variants are printed-->
> 		<xsl:text>&#xA;</xsl:text>
> 	</xsl:template>
> 	
> 	<xsl:template name="procSubject">
> 		<xsl:variable name="subjectID" select="."/>
> 		<xsl:value-of select="$subjectID"/>
> 		<!--get list of all variants for the subject -->
> 		<xsl:variable name="subject-variants" 
> select="//n1:variant[../../n1:subjectXref=$subjectID]"/>
> 		<xsl:for-each select="$subject-variants">
> 			<!--Sort on all variants on experiment-->
> 			<xsl:sort select="../../.."/>
> 			<!--Sort on all variant position-->
> 			<xsl:sort select="n1:position"/>
> 			<xsl:call-template name="procVariant">
> 				<!--xsl:with-param 
> name="variant" select="."/-->
> 			</xsl:call-template>
> 		</xsl:for-each>
> 		<!-- Output carriage return after all subject 
> variants are printed-->
> 		<xsl:text>&#xA;</xsl:text>
> 	</xsl:template>
> 	
> 	<xsl:template name="procVariantHeader">
> 		<xsl:text>, Exp Var.Pos </xsl:text>
> 		<xsl:value-of select="n1:position"/>
> 	</xsl:template>		
> 
> 	<xsl:template name="procVariant">
> 		<xsl:value-of select="concat(', 
> ',n1:firstAllele,'/',n1:secondAllele)"/>
> 	</xsl:template>		
> 	
> </xsl:stylesheet>
> 
> 
> Thanks,
> 
> -mat
> 
>  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