2012-12-19 5 views
5

J'ai un fichier XML qui ressemble à cet exemple:XSLT tri et le regroupement impliquant des attributs

<Data> 
    <defect> 
    <record-id>1</record-id> 
    <custom-field-value field-name="Release Version" field-value="1.0"/> 
    <custom-field-value field-name="Other info" field-value=""/> 
    <custom-field-value field-name="More info" field-value="blah"/> 

    <event include-in-release-notes="yes"> 
     <notes>This is a release note to include</notes> 
    </event> 

    <event include-in-release-notes="no"> 
     <notes>This is not a release note</notes> 
    </event> 
    </defect> 

    <defect> 
    <record-id>2</record-id> 
    <custom-field-value field-name="Release Version" field-value="1.5"/> 
    <custom-field-value field-name="Other info" field-value=""/> 
    <custom-field-value field-name="More info" field-value="blah"/> 

    <event include-in-release-notes="yes"> 
     <notes>This is a release note to include for 1.5</notes> 
    </event> 

    <event include-in-release-notes="no"> 
     <notes>This is not a release note</notes> 
    </event> 
    </defect> 
</Data> 

Ce que je suis en train de faire est de créer une notes de publication que les premières sortes et trouve tout de l'unique @ valeurs de champ des éléments dont le nom de champ @ est égal à "Release Version". Il peut y avoir d'autres éléments qui ne se rapportent pas à la version finale. Voici la sortie Je cherche:

Release Version: 1.0 
    o This is a release note to include 
Release Version: 1.5 
    o This is a release note to include for 1.5 
Release Verison: x.x 
    o one release note 
    o another release note 

J'ai lu un tas sur la méthode « Muenchian » et le tri et le regroupement, mais je suis aux prises avec le fait que je les attributs que je dois comparer aux. La plupart des exemples que j'ai lus traitent du tri par éléments qui semble beaucoup plus intuitif. Et j'ai besoin de trouver et trier plusieurs attributs, eh bien, ma tête commence à exploser.

Je suis venu avec des feuilles de style qui va me donner tous les éléments qui ont « version Release » comme le texte en utilisant:

<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/> 
<xsl:for-each select=key('keyMajorReleases', 'Release Version')"> 
    <xsl:sort order="descending" data-type="text" select="@field-value"/> 

Mais qui leur donne tout pour moi, pas seulement ceux uniques . Et puis je n'ai pas compris comment obtenir l'élément 'événement' qui a la note de sortie que je dois imprimer.

Quand j'ai essayé d'utiliser « générer-id() », je ne reçois un résultat, comme je suppose qu'il n'y a qu'une seule entrée unique avec ma valeur pour trouver:

<xsl:for-each select="//custom-field-value[generate-id(.)=generate-id(key('keyMajorReleases', 'Release Version')[1])]"> 

Répondre

2

Avec votre actuelle clé ...

<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/> 

vous serait groupement -champ valeur personnalisée éléments par nom de champ, que vous feriez si vous vouliez trouver les valeurs de nom champ distincts. Cependant, vous souhaitez regrouper les attributs de valeur de champ pour les 'Versions de version'. Cela signifie que vous devez définir votre clé comme ceci:

<xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/> 

Avec cette touche, vous êtes correspondant uniquement sur -champ valeur personnalisée où le nom du champ est « Release Version ». Vous pouvez ensuite utiliser pour obtenir les valeurs de champ distinctes attributs, comme ceci:

<xsl:apply-templates 
    select="defect/custom-field-value[@field-name='Release Version'] 
     [generate-id()=generate-id(key('keyMajorReleases', @field-value)[1])]" /> 

Ensuite, pour obtenir vos notes de version pour une version version donnée, vous pouvez ensuite utiliser à nouveau la touche

<xsl:apply-templates 
    select="key('keyMajorReleases', @field-value) 
     /following-sibling::event[@include-in-release-notes='yes']" /> 

ici est le XSLT plein

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/> 
    <xsl:template match="/Data"> 
     <ul> 
     <xsl:apply-templates select="defect/custom-field-value[@field-name='Release Version'][generate-id()=generate-id(key('keyMajorReleases', @field-value)[1])]"/> 
     </ul> 
    </xsl:template> 

    <xsl:template match="custom-field-value"> 
     <li>Release Version: <xsl:value-of select="@field-value"/> 
     <ul> 
      <xsl:apply-templates select="key('keyMajorReleases', @field-value)/following-sibling::event[@include-in-release-notes='yes']"/> 
     </ul></li> 
    </xsl:template> 

    <xsl:template match="event"> 
     <li> 
     <xsl:value-of select="notes"/> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

appliqué à votre XML exemple, ce qui suit est sortie

<ul> 
    <li>Release Version: 1.0 
     <ul> 
      <li>This is a release note to include</li> 
     </ul> 
    </li> 
    <li>Release Version: 1.5 
     <ul> 
     <li>This is a release note to include for 1.5</li> 
     </ul> 
    </li> 
</ul> 
+0

Tim, merci pour votre aide! Je n'étais pas au courant de cette syntaxe dans la 'clé' et le 'select' pour spécifier un attribut spécifique égal à une valeur. Cela a fait l'affaire, merci encore! – Gunn