2010-10-04 4 views
2

J'ai un fichier comme XML:Comment obtenir des valeurs de toutes les occurrences d'un même élément dans XSLT?

<company> 
    <dept> 
    <name> Dept-A</name> 
    <proj> 
     <id> A1 </id> 
     <noOfPeople> 5 </noOfPeople> 
     <proj> 
     <id>A11</id> 
     <noOfPeople> 2 </noOfPeople> 
     </proj> 
    </proj> 
    </dept> 
    <dept> 
     .... 
    </dept> 
</company> 

maintenant:

  1. Je veux avoir une liste de tous les projets. Même si ce sont des sous projets comme A11 à l'intérieur de A1, je veux tous les identifiants de projets distincts.
  2. En outre, je veux avoir cette liste à ma disposition à plusieurs endroits, par ex. En analysant le projet A1, ou en analysant A11 ou tout autre niveau d'imbrication de proj.

Existe-t-il un moyen d'atteindre cet objectif dans XSLT?

Merci.
Tara Singh

+0

@ Tara-Singh: Bonne question (+1). Voir ma réponse pour deux solutions XSLT 1.0 différentes, complètes et courtes. :) –

Répondre

2
  1. 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.

  2. 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(.,'&#xA;')"/> 
    </xsl:for-each> 
    All Distinct Project IDs: 
    <xsl:for-each select="$vdistinctProjIds"> 
    <xsl:value-of select="concat(.,'&#xA;')"/> 
    </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.

+0

+1 Bonne réponse et explication. –

1

Oui, c'est possible.

L'expression XPath suivante sélectionne tous les proj éléments du document:

//proj 
Questions connexes