2012-12-19 10 views
5

Ho un file XML che assomiglia a questo esempio:XSLT ordinamento e raggruppamento che coinvolgono gli attributi

<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> 

Quello che sto cercando di fare è creare un note di rilascio che documentano primi tipi e trova tutte le uniche @ valori del valore di campo degli elementi che hanno il @ nome-campo uguale a "Versione di rilascio". Potrebbero esserci altri elementi che non riguardano la versione di rilascio. Ecco l'output che sto cercando:

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 

Ho letto un mucchio sul metodo "Muenchian" e ordinamento e raggruppamento, ma sto lottando con il fatto che io ho gli attributi che devo Paragonare a. La maggior parte degli esempi che ho letto discutono l'ordinamento su elementi che sembrano molto più intuitivi. E ho bisogno di trovare e ordinare su più attributi, beh, la mia testa inizia a esplodere.

mi è venuta in mente fogli di stile che mi darà tutti gli elementi che hanno "Release Version" come il testo utilizzando:

<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"/> 

Ma che li dà a me, non solo quelli unici . E poi non ho capito come ottenere l'elemento 'evento' che ha la nota di rilascio che ho bisogno di stampare.

Quando ho provato ad usare 'generate-id()', ho solo un risultato, come immagino che ci sia solo una voce unica, con il mio valore di trovare:

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

risposta

2

Con il vostro attuale chiave ...

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

si sarebbe raggruppamento custom-field-value elementi di campo-nome, che si dovrebbe fare se si voleva trovare i valori di campo nomi distinti. Tuttavia, si desidera raggruppare gli attributi del valore del campo per "Release Versions". Ciò significa che è necessario definire la propria chiave in questo modo:

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

Con questa chiave, si sono corrispondenti solo su custom-field-value in cui il nome del campo è 'uscita la versione'. È quindi possibile utilizzare questo per ottenere i valori dei campi distinti attributi, in questo modo:

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

Quindi per ottenere le note di rilascio per una determinata versione di rilascio, è possibile quindi utilizzare il tasto di nuovo

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

Qui è il XSLT piena

<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> 

Quando applicato al tuo XML di esempio, il seguente è uscita

<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, grazie per il tuo aiuto! Non ero a conoscenza di quella sintassi nella "chiave" e nella "selezione" per specificare un attributo specifico uguale a un valore. Questo ha funzionato, grazie ancora! – Gunn

Problemi correlati