2010-02-08 8 views
3

Bonjour, J'essaie de trier mon xml par le nombre d'occurrences de l'élément 'répondre' avec l'attribut 'id' et obtenir simplement un résumé.Problème dans le tri XML dans XSLT 2.0 des idées?

<person id="1"> 
<answer id="A"/> 
<answer id="B"/> 
</person> 

<person id="2"> 
<answer id="A"/> 
<answer id="C"/> 
</person> 

<person id="3"> 
<answer id="C"/> 
</person> 

Je veux simplement le texte de synthèse sur la sortie:

A = 2 temps (s)
C = 2 temps (s)
B = 1 heure (s)

Dans XSLT 2.0 i essayé:

<xsl:for-each select="distinct-values(/person/answer)"> 
<xsl:sort select="count(/person/answer)" data-type="number"/> 
<xsl:value-of select="./@id"/> = 
<xsl:value-of select="count(/person/answer[@id=./@id])"/> time(s) 
</xsl:for-each> 

mais il ne fonctionne pas:
dans XMLSpy 2008:
"Erreur dans XPath 2.0 expression Pas un élément de noeud"

à Saxon 9:
XPTY0020 : '/' Ne peut pas sélectionner le noeud racine de l'arborescence contenant l'élément de contexte: l'élément de contexte est une valeur atomique
Fa Il est nécessaire de compiler une feuille de style. 1 erreur détectée.

Répondre

4

Je groupe et compter les éléments de chaque groupe:

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

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
    <xsl:for-each-group select="//person/answer" group-by="@id"> 
     <xsl:sort select="count(current-group())" order="descending"/> 
     <xsl:value-of select="concat(current-grouping-key(), ' = ', count(current-group()), ' time(s).&#10;')"/> 
    </xsl:for-each-group> 
    </xsl:template> 

</xsl:stylesheet> 

De cette façon, lorsqu'il est appliqué à l'entrée

<root> 
<person id="1"> 
<answer id="A"/> 
<answer id="B"/> 
</person> 

<person id="2"> 
<answer id="A"/> 
<answer id="C"/> 
</person> 

<person id="3"> 
<answer id="C"/> 
</person> 
</root> 

-je obtenir le résultat

A = 2 time(s). 
C = 2 time(s). 
B = 1 time(s). 
+0

Merci beaucoup :) – Tommy