2009-08-18 4 views
0

J'ai lu avec intérêt les techniques disponibles sur le Web pour extraire une liste unique d'éléments à partir d'un fichier XML contenant des doublons en utilisant XSL.XSL: Combinaison de groupes et de modèles d'appel

Celles-ci vont en 2 catégories: 1) La méthode Muenchian (exemple: http://www.jenitennison.com/xslt/grouping/) 2) Ou le frère précédent Recherch Ces deux compter sur une expression XPath pour sélectionner les données à un groupe par.

Cependant, dans le fichier XML que j'essaie de résoudre, les données ne sont pas présentes «nativement» dans le fichier XML. J'utilise un template xsl: pour calculer des données agrégées de mes éléments. Et je voudrais regrouper basé sur les données agrégées.

Par exemple, j'ai:

<filmsreview> 
    <record><data name='movie'>Star Wars</data><data name='ratings'>John:Good, Mary:Good</data></record> 
    <record><data name='movie'>Indiana Jones</data><data name='ratings'>John:Good, Mary:Bad, Helen:Average</data></record> 
    <record><data name='movie'>Titanic</data><data name='ratings'>John:Bad, Helen:Good</data></record> 
</filmsreview> 

Je sais que la Structuration des données ne sont pas parfait et que, en créant des sous-éléments que je pouvais faire quelque chose de plus facile, mais je ne peux pas changer facilement la source de données, donc nous allons prendre cela comme un défi.

Et je voudrais construire un récapituler où j'ai évaluations distinctes de John: notes John: Bonne Bad

J'ai un xsl: template qui peut prendre un élément d'enregistrement et de retour de la note de John pour cet enregistrement : Exemple:

<xsl:template name="get_rating"> 
    <xsl:param name="reviewer" /> 
    <!-- I use some string manipulation, and xsl:value-of to return the review for John--> 
</xsl:template> 

je peux l'appeler sous un xsl: for-each pour obtenir la liste exhaustive de l'examen de John. Mais je ne peux pas combiner cet appel avec l'une des méthodes pour obtenir des valeurs uniques. Dois-je utiliser un XSL intermédiaire pour convertir mon fichier XML de manière plus structurée? Ou puis-je faire en une seule étape?

Un grand merci Gérard

Répondre

1

Hmm ... Cela devrait être possible en utilisant des variables xslt et la méthode nodeset, peut-être quelque chose comme ceci:

<xsl:variable name="_johnsRatings"> 
    <xsl:apply-templates select="/" mode="johnsRatings" /> 
</xsl:variable> 
<xsl:variable name="johnsRatings" select="msxsl:node-set($_johnsRatings)" /> 

<xsl:template match="/" mode="johnsRatings"> 
    <Ratings> 
     <xsl:for-each select="/filmsReview/record/data[@name='ratings']"> 
       <Rating><xsl:call-template name="get_rating" /></Rating> 
     </xsl:for-each> 
    </Ratings> 
</xsl:template> 

À ce stade, il devrait être possible d'interroger la variable johnsRatings $ en utilisant des requêtes standard XPath, et vous pouvez utiliser l'une des deux méthodes que vous avez mentionnées ci-dessus pour récupérer les valeurs uniques de lui ...

espoir qui aide

EDIT: Je ne sais pas quel moteur XSLT vous utilisez, je suppose que vous avez accès à la fonction msxsl: node-set(). Cependant, la plupart des processeurs XSLT ont des méthodes similaires, donc vous devrez peut-être chercher une méthode équivalente dans votre processeur.

+0

Merci, cette réponse m'a aidé à trouver la solution. Quelques choses qui pourraient compléter la réponse: L'attribut suivant doit être ajouté au xsl: stylesheet xmlns: msxsl = « urn: schemas-microsoft-com: xslt » Voici les principaux besoins à définir: La boucle suivante peut être faite pour obtenir les éléments uniques: