XSLT 1.0:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<!-- index Description elements by their text value -->
<xsl:key name="kDescription" match="Description" use="text()" />
<xsl:template match="/">
<output>
<!-- process all Description elements... -->
<xsl:apply-templates select="Problems/Problem/Description">
<!-- ...sorted by their own text value, ascending -->
<xsl:sort select="text()" />
<!-- pass in the File value that we want to filter for -->
<xsl:with-param name="file" select="'file1'" />
</xsl:apply-templates>
</output>
</xsl:template>
<xsl:template match="Description">
<xsl:param name="file" select="''" />
<!--
check if the current Description node is the first in its
respective group, that has a File value we care for
-->
<xsl:if test="
$file != ''
and
generate-id()
=
generate-id(key('kDescription', .)[../File = $file][1])
">
<!-- for the sake of simplicity, just make a copy here -->
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Avec cette entrée:
<Problems>
<Problem>
<File>file1</File>
<Description>desc1</Description>
</Problem>
<Problem>
<File>file1</File>
<Description>desc2</Description>
</Problem>
<Problem>
<File>file2</File>
<Description>desc3</Description>
</Problem>
<Problem>
<File>file2</File>
<Description>desc1</Description>
</Problem>
<Problem>
<File>file1</File>
<Description>desc2</Description>
</Problem>
</Problems>
Je reçois:
<output>
<Description>desc1</Description>
<Description>desc2</Description>
</output>
Une brève explication de la part de la feuille de style qui fait le levage de charges lourdes:
$file != ''
and
generate-id()
=
generate-id(key('kDescription', .)[../File = $file][1])
La première partie est évidente - il est juste là pour faire en sorte qu'une chaîne de filtre $file
a été adoptée en
La deuxième partie est simple regroupement Muenchian avec un petit twist.. Il compare les ID de deux nœuds, l'un en cours (generate-id()
) et l'autre du groupe kDescription
, filtré par la valeur $file
.
kDescription
index <Description>
éléments par leur valeur de texte, ce qui signifie que les noeuds avec le même texte, mais un autre <File>
accompagnant sera retourné par l'appel à key()
. Nous devons les filtrer.
Si le nœud actuel est égal au premier nœud du groupe qui a la bonne valeur <File>
, le test réussit et quelque chose est imprimé, sinon rien ne se passe.
En fait, c'est très bien que vous avez lié à une question similaire. De cette façon, je peux vous donner une solution complète et vous avez encore quelques réflexions à faire, en l'adaptant à votre situation actuelle. ;-) – Tomalak