2

This is my xml input

<issues>
  <issue status="open" type="Bug">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
      <fix_version>6.13.0</fix_version>
      <fix_version>6.12.0</fix_version>
    </fix_versions>
    <title>issue1</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Feature">
    <fix_versions>
      <fix_version>6.13.0</fix_version>
    </fix_versions>
    <title>issue2</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Improvement">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
    </fix_versions>
    <title>issue3</title>
    <description>Description</description>
  </issue>
  ...
</issues>

And this is my xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="versions" match="fix_version" use="."/>
  <xsl:key name="type" match="@type" use="../*/fix_version"/>

  <xsl:template match="fix_version[generate-id()=generate-id(key('versions',.)[1])]">
     <div class="version">
     <a><xsl:value-of select="."/></a>
     <xsl:value-of select="../../@type"/>
       <div class="issues">
         <xsl:for-each select="key('type',.)">
           <div class="{..}">
             <a href="{../title}"><xsl:value-of select="../title"/></a>
           </div>
         </xsl:for-each>
       </div>
     </div>
   </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

And i want an output like this:

<div class="version">
  <a>6.14.0</a>
  <div class="issues">
    <div class="Bugs">
      <a href="issue1">issue1</a>
      <a href="issue7">issue7</a>
      <a href="issue2">issue12</a>
      <a href="issue17">issue17</a>
    </div>
    <div class="Improvements">
      <a href="issue3">issue3</a>
      <a href="issue9">issue9</a>
    </div>
  </div>
</div>
<div class="version">
  <a>6.13.0</a>
  <div class="issues">
    <div class="Bug">
      <a href="issue1">issue1</a>
      <a href="issue11">issue11</a>
    </div>
    <div class="Feature">
      <a href="issue2">issue2</a>
    </div>
  </div>
 </div>
 <div class="version">
   <a>6.12.0</a>
   <div class="issues">
     <div class="Bug">
       <a href="issue1">issue1</a>
     </div>
   </div>
</div>

But i have an output like this:

<div class="version">
  <a>6.14.0</a>
  <div class="issues">
    <div class="Bugs">
      <a href="issue1">issue1</a>
    </div>
    <div class="Bugs">
      <a href="issue7">issue7</a>
    </div>
    <div class="Bugs">
      <a href="issue2">issue12</a>
    </div>
    <div class="Bugs">
      <a href="issue17">issue17</a>
    </div>
    <div class="Improvements">
      <a href="issue3">issue3</a>
    </div>
    <div class="Improvements">
      <a href="issue9">issue9</a>
    </div>
  </div>
</div>
<div class="version">
  <a>6.13.0</a>
  <div class="issues">
    <div class="Bug">
      <a href="issue1">issue1</a>
    </div>
    <div class="Bug">
      <a href="issue11">issue11</a>
    </div>
    <div class="Feature">
      <a href="issue2">issue2</a>
    </div>
  </div>
 </div>
 <div class="version">
   <a>6.12.0</a>
   <div class="issues">
     <div class="Bug">
       <a href="issue1">issue1</a>
     </div>
   </div>
</div>

As you see the Issues ar not grouped in an container named "bugs", "improvements" or "features" - But this is what i want. I tried stuff like this

But whatever i tried - nothing worked. I really have no plan how to group them.

KddC
  • 2,853
  • 2
  • 17
  • 19

2 Answers2

0

I think you have to make your key more specific. When defining a key in XSLT it is always defined for the whole XML document, not for sections. You have to concat() more than one value when defining a key.

Plesae have a look at this thread: Muenchian Grouping - group within a node, not within the entire document

Nimantha
  • 6,405
  • 6
  • 28
  • 69
Peter
  • 1,786
  • 4
  • 21
  • 40
  • Hi, i already tried that - my Problem with that, that the key and the line with the for each have to be the same and i dont know how to do that. Do you know if i define the key like this ``, can i use the line with the for each just like this: `` or do i have to do another concat? Oh, and i really read some articles about the muenchian method and really tried it on my own, but for some reason i dont get in which node i actually am. :-/ – KddC Aug 27 '12 at 20:17
  • Hello KddC, I tried around for a while and honestly could not get your desired output yet. It is trickier than I thought - your question +1 – Peter Aug 28 '12 at 12:28
  • Yes, but this was only for the first level. Cant get the second elevel (the types) to work – KddC Sep 08 '12 at 11:16
  • @KddC: I don't understand. What do you mean by `Cant get the second elevel (the types) to work` I thought Dimitre's solution looked good. Can you elaborate please, maybe edit your question or post a new one. – Peter Sep 12 '12 at 18:20
0

This transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="versions" match="fix_version" use="."/>
  <xsl:key name="type" match="@type" use="../*/fix_version"/>

  <xsl:template match="fix_version[generate-id()=generate-id(key('versions',.)[1])]">
     <div class="version">
     <a><xsl:value-of select="."/></a>
       <div class="issues">
         <xsl:for-each select="key('type',.)">
           <div class="{.}">
             <a href="{../title}"><xsl:value-of select="../title"/></a>
           </div>
         </xsl:for-each>
       </div>
     </div>
   </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

when applied on the provided XML document:

<issues>
  <issue status="open" type="Bug">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
      <fix_version>6.13.0</fix_version>
      <fix_version>6.12.0</fix_version>
    </fix_versions>
    <title>issue1</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Feature">
    <fix_versions>
      <fix_version>6.13.0</fix_version>
    </fix_versions>
    <title>issue2</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Improvement">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
    </fix_versions>
    <title>issue3</title>
    <description>Description</description>
  </issue>
  ...
</issues>

produces the wanted, correct result:

<div class="version">
   <a>6.14.0</a>
   <div class="issues">
      <div class="Bug">
         <a href="issue1">issue1</a>
      </div>
      <div class="Improvement">
         <a href="issue3">issue3</a>
      </div>
   </div>
</div>
<div class="version">
   <a>6.13.0</a>
   <div class="issues">
      <div class="Bug">
         <a href="issue1">issue1</a>
      </div>
      <div class="Feature">
         <a href="issue2">issue2</a>
      </div>
   </div>
</div>
<div class="version">
   <a>6.12.0</a>
   <div class="issues">
      <div class="Bug">
         <a href="issue1">issue1</a>
      </div>
   </div>
</div>
Dimitre Novatchev
  • 240,661
  • 26
  • 293
  • 431