Je veux avoir une liste de tous les projets. Même si elles sont sous Projets comme A11 à l'intérieur de A1, je veux chaque id de proj distinct.
De plus, je veux que cette liste soit disponible à plusieurs endroits, . Lors de l'analyse du projet A1, ou pendant que analysant A11 ou tout autre niveau d'imbrication de proj.
Existe-t-il un moyen de réaliser cela dans XSLT?
Vous avez pas précisé s'il est possible d'avoir plus d'un élément <proj>
avec la même valeur de son enfant <id>
.
Voici une solution XSLT qui définit deux variables globales, un noeud-ensemble de tous <id>
éléments dans le document XML, l'autre - un ensemble de nœuds de <id>
éléments dont chacun a une valeur différent des valeurs du reste et toutes les valeurs de <id>
sont représentées. Comme il s'agit des variables globales, elles sont accessibles à n'importe quel point de votre code XSLT, même dans les feuilles de style importées/incluses ou importées/incluses.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kIdByVal" match="id" use="."/>
<xsl:variable name="vallProjIds" select="//proj/id"/>
<xsl:variable name="vdistinctProjIds" select=
"//proj/id[generate-id()
=
generate-id(key('kIdByVal', .)[1])
]
"/>
<xsl:template match="/">
All Project IDs:
<xsl:for-each select="$vallProjIds">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
All Distinct Project IDs:
<xsl:for-each select="$vdistinctProjIds">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Lorsque cette transformation est appliquée sur le document XML suivant (basé sur celui fourni, mais fait bien formé et étendu pour couvrir plus de cas):
<company>
<dept>
<name> Dept-A</name>
<proj>
<id> A1 </id>
<noOfPeople> 5 </noOfPeople>
<proj>
<id>A11</id>
<noOfPeople> 2 </noOfPeople>
</proj>
</proj>
</dept>
<dept>
<name> Dept-B</name>
<proj>
<id> A1 </id>
<noOfPeople> 5 </noOfPeople>
</proj>
<proj>
<id> B1 </id>
<noOfPeople> 5 </noOfPeople>
<proj>
<id>B11</id>
<noOfPeople> 2 </noOfPeople>
</proj>
</proj>
</dept>
</company>
la recherché, résultat correct est produit:
All Project IDs:
A1
A11
A1
B1
B11
All Distinct Project IDs:
A1
A11
B1
B11
Prenez note que cette solution utilise la méthode de Muenchian pour le regroupement afin d'obtenir l'ensemble de Id
s avec des valeurs uniques.
@ Tara-Singh: Bonne question (+1). Voir ma réponse pour deux solutions XSLT 1.0 différentes, complètes et courtes. :) –