2012-12-19 16 views
5

Mam plik XML, który wygląda jak ten przykład:XSLT sortowania i grupowania udziałem atrybuty

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

Co staram się zrobić, to stworzyć informacje o wersji udokumentować, że pierwsze rodzaje i odkryć wszystkie unikalne @ wartości pól wartości elementów, które mają nazwę pola @ równą "Wersja wydania". Mogą istnieć inne elementy, które nie dotyczą wersji Release. Oto wynik Szukam:

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 

Czytałem się kilka o „Muenchian” metody i sortowania i grupowania, ale mam zmaga się z faktem, że mam atrybuty muszę porównać do. Większość z przeczytanych przeze mnie przykładów omawia sortowanie na elementach, które wydają się znacznie bardziej intuicyjne. Muszę znaleźć i posortować wiele atrybutów, moja głowa dopiero zaczyna eksplodować.

mam wymyślić stylów, które będą mi podać wszystkie elementy, które mają „wydanej wersji” jako tekst przy użyciu:

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

Ale to daje mi je wszystkie, nie tylko te niepowtarzalne . A potem nie zorientowałem się, jak zdobyć element "event", który ma notatkę wydania, którą muszę wydrukować.

Kiedy próbowałem użyć „generate-id()”, mam tylko jeden wynik, jak myślę, że jest tylko jeden unikalny wpis z mojego wartości znaleźć:

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

Odpowiedz

2

z aktualnym klucz ...

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

Użytkownik będzie grupowanie niestandardowym polu wartość elementy polem-name, co byś zrobił, gdybyś chciał znaleźć różne wartości pola nazw. Jednak chcesz grupować według atrybutów wartości pól dla "Wersji Release". Oznacza to, trzeba zdefiniować klucz tak:

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

Z tego klucza, to są dopasowane tylko na niestandardowego pola wartości gdzie nazwa pola jest „Release Version”. Następnie można użyć tego, aby uzyskać różne wartości pól atrybutów tak:

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

Następnie, aby uzyskać informacje o wersji dla danej wersji systemu, można następnie użyć klawisza ponownie

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

Tutaj jest to pełna XSLT

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

Po nałożeniu na próbkę XML, co następuje wyjście

<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, dzięki za pomoc! Byłem nieświadomy tej składni w "kluczu" i "selekcji" dla określenia konkretnego atrybutu równego wartości. To sprawiło, dzięki jeszcze raz! – Gunn