2017-09-25 2 views
-1

J'essaie de trier les nœuds parents par deux attributs dans deux éléments enfants distincts. Plus précisément, je veux trier d'abord par « attaque/@ pct » puis par « misc/@ pts » Ci-dessous mon code source:XSLT Tri d'un parent par deux attributs enfants

<player uni="11" code="11" name="RACHEL, Devon" checkname="RACHEL,DEVON" class="JR" gp="4" ms="1"> 
    <attack k="14" e="1" ta="41" pct=".317"></attack> 
    <set a="0" e="0" ta="2"></set> 
    <serve sa="0" se="0" ta="6"></serve> 
    <defense dig="3" re="2" ta="13"></defense> 
    <block bs="0" ba="2" be="0" tb="2"></block> 
    <misc bhe="0" pts="15.0"></misc> 
</player> 
<player uni="13" code="13" name="BECKMAN, Allison" checkname="BECKMAN,ALLISON" class="JR" gp="4" ms="1"> 
    <attack k="3" e="1" ta="4" pct=".500"></attack> 
    <set a="51" e="0" ta="128"></set> 
    <serve sa="0" se="0" ta="16"></serve> 
    <defense dig="17" re="0" ta="0"></defense> 
    <block bs="0" ba="2" be="1" tb="2"></block> 
    <misc bhe="0" pts="4.0"></misc> 
</player> 
<player uni="2" code="2" name="MADISON, Kennedy" checkname="MADISON,KENNEDY" class="JR" gp="4"> 
    <attack k="14" e="7" ta="32" pct=".219"></attack> 
    <set a="0" e="0" ta="3"></set> 
    <serve sa="0" se="0" ta="0"></serve> 
    <defense dig="3" re="0" ta="2"></defense> 
    <block bs="0" ba="5" be="0" tb="5"></block> 
    <misc bhe="1" pts="16.5"></misc> 
</player> 
<player uni="20" code="20" name="MUMMEY, Krissy" checkname="MUMMEY,KRISSY" class="SR" gp="4" ms="1"> 
    <attack k="12" e="4" ta="31" pct=".258"></attack> 
    <set a="0" e="0" ta="1"></set> 
    <serve sa="0" se="1" ta="8"></serve> 
    <defense dig="5" re="0" ta="1"></defense> 
    <block bs="0" ba="4" be="1" tb="4"></block> 
    <misc bhe="0" pts="14.0"></misc> 
</player> 

Essentiellement, je veux cracher le premier joueur, même si ni son misc/@ pts ni attack/@ pct se classeraient en premier dans chaque tri individuel. Voici le code que j'ai essayé, mais il semble qu'il manque quelque chose - il va trier par le premier, mais complètement ignorer le second.

<xsl:for-each select="player"> 
<xsl:sort select="attack/@pct" data-type="number" order="descending"/> 
<xsl:sort select="misc/@pts" data-type="number" order="descending"/> 
... 
</xsl:for-each> 
+0

Dans vos données d'exemple, tous les ont une valeur distincte pour 'attack/@ p ct'. La deuxième clé de tri n'est donc pas pertinente pour ces données. –

+0

Si vous souhaitez trier les données dans l'ordre présenté, quel est le critère réel par lequel la commande est déterminée? Je devine une combinaison de 'attack/@ pct' et' misc/@ pts'; dans ce cas, c'est la * combinaison * que vous voulez utiliser comme clé de tri. –

+0

Je veux trier par attaque/@ pct et ensuite dans ce genre, par misc/@ pts. Essentiellement, ce que je rencontre, c'est que le joueur avec le plus de points n'est pas toujours le plus efficace - ce qui signifie qu'un joueur avec deux ou trois points de moins pourrait avoir une attaque/@ pct sensiblement plus élevée. Peut-être quelque chose où c'est le tri par attaque/@ pct en définissant une valeur minimale (supérieure à) pour misc/@ pts? – wnoble13

Répondre

1

Selon vos commentaires que vous « voulez trier les joueurs qui ont une « » valeur d'au moins 0,300 par « attaque/@ pct misc/@ pts ». Dans ce cas, l'expression que vous est-ce ... veulent

<xsl:sort select="misc[../attack/@pct &gt;= .300]/@pts" data-type="number" order="descending"/> 

Notez que les joueurs avec une « attaque/@ pct » moins que 0,300 apparaîtra toujours dans la sortie, sans ordre particulier, mais après ceux qui ne dépasse pas 0,300

+0

Cela a fonctionné. Je vous remercie! J'avais le sentiment d'être sur la bonne voie (un peu) mais je n'arrivais pas à me débrouiller tout seul. – wnoble13