Rassemblement des noeuds, maximum et xsl:key
Bonjour,
Tout d'abord pardon pour le titre, mais je n'ai pas réussi à en trouver un mieux.
Voici mon XML simplifié :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
<sdx:results>
<sdx:result>
<article id="N1">
<event role="operation">
<date>
<year> 1992 </year>
</date>
</event>
</article>
</sdx:result>
<sdx:result>
<article id="N2">
<event role="operation">
<date role="debut">
<year> 1991 </year>
</date>
<date role="fin">
<year> 1993 </year>
</date>
</event>
<event role="operation">
<date>
<year> 1995 </year>
</date>
</event>
</article>
</sdx:result>
<sdx:result>
<article id="N3">
<event role="operation">
<date role="debut">
<year> 1992 </year>
</date>
<date role="fin">
<year> 1993 </year>
</date>
</event>
</article>
</sdx:result>
<sdx:result>
<article id="N4">
<event role="operation">
<date>
<year> 1992 </year>
</date>
</event>
<event role="operation">
<date role="debut">
<year> 1990 </year>
</date>
<date role="fin">
<year> 1991 </year>
</date>
</event>
</article>
</sdx:result>
</sdx:results> |
Chaque event "operation" est daté, soit il n'y a qu'une seule date (car durée d'1 an ou moins), soit il y a une date de début et de fin.
Il peut y avoir plusieurs event "operation" par article.
Ce que je voudrai faire, c'est récupérer l'id de mes articles selon la date de fin (si il y a plusieurs event, prendre la plus grande date). Dans cet exemple, cela donnerai donc :
Code:
1 2 3 4
|
1992 : N1, N4
1993 : N3
1995 : N2 |
Je pense qu'il faut que j'utilise xsl:key pour "rassembler" mes nœuds selon les dates, et en triant la valeur de la date maximale avec un tri et un position()=1, mais cela fait déjà un moment que je tourne en rond, et je m'y suis emmêler les neurones. :marteau:
Tout ce que j'ai réussi à faire, c'est mettre mes articles par date :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<xsl:key name="date" match="adfi:event[@role='operation']/adfi:date/adfi:year" use="."/>
<xsl:key name="dateF" match="adfi:event[@role='operation']/adfi:date[@role='fin']/adfi:year" use="."/>
<xsl:for-each select="//adfi:event[@role='operation']/adfi:date/adfi:year[generate-id() = generate-id(key('dateF', .)[1]) or generate-id() = generate-id(key('date', .)[1])]">
<xsl:sort select="." />
<xsl:variable name="vdate" select=".">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:value-of select="$vdate"/>
<xsl:for-each select="//sdx:result[./adfi:article/adfi:event/adfi:date/adfi:year=$vdate]">
<xsl:value-of select="./adfi:article/@id"/>
</xsl:for-each>
</xsl:for-each> |
Ce qui me donne quelque chose de se style :
Code:
1 2 3 4 5
|
1991 : N4
1992 : N1, N4
1993 : N2, N3
1995 : N2 |
Si vous avez une idée pour m'aiguiller sur la bonne voie, :merci: