JO: nochmal xsl:key und Gruppierung

Hallo,

bezugnehmend auf die unten angeführte XML, will ich alle Titel gruppieren, die dasselbe Keyword besitzen.

Die Ausgabe der Transformation ist folgende:

Keyword a,
 Title 1
     Title 3
Keyword b,
     Title 2

Allerdings sollte sie aber so aussehen (oben fehlt nämlich aus irgend einem Grund das Keyword c und der zugehörige Title 3):

Keyword a,
 Title 1
     Title 3
Keyword b,
     Title 2
Keyword c,
 Title 3

Sieht jemand vielleicht woran das liegt?

XML

<?xml version="1.0" encoding="ISO-8859-1" ?>
<RESPONSE SESSION_ID="ip171871028299926" TYPE="lookup">
<LOOKUP ORIGXML="17225_orig.xml" NEXTREF="6" PREVREF="0">
<HIT>
<MOL>
<REFS>
<REF NO="1" CURRENT="true">
<TITLE>Title 1</TITLE>
<KEYWORDS>
<KEYWORD>Keyword a</KEYWORD>
</KEYWORDS>
</REF>
<REF NO="2" CURRENT="true">
<TITLE>Title 2</TITLE>
<KEYWORDS>
<KEYWORD>Keyword b</KEYWORD>
</KEYWORDS>
</REF>
<REF NO="3" CURRENT="true">
<TITLE>Title 3</TITLE>
<KEYWORDS>
<KEYWORD>Keyword c</KEYWORD>
<KEYWORD>Keyword a</KEYWORD>
</KEYWORDS>
</REF>
</REFS>
</MOL>
</HIT>
</LOOKUP>
</RESPONSE>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:key name="REF-by-KEYWORD" match="REF" use="KEYWORDS/KEYWORD"/>

<xsl:template match="/RESPONSE/LOOKUP/HIT/MOL/REFS">
 <xsl:for-each select="REF[count(. | key('REF-by-KEYWORD', KEYWORDS/KEYWORD)[1]) = 1]">
  <xsl:value-of select="KEYWORDS/KEYWORD"/>,<br/>
  <xsl:for-each select="key('REF-by-KEYWORD', KEYWORDS/KEYWORD)">
   &#160;<xsl:value-of select="TITLE"/><br/>
  </xsl:for-each>
 </xsl:for-each>

</xsl:template>

</xsl:stylesheet>

  1. Hallo,

    Allerdings sollte sie aber so aussehen (oben fehlt nämlich aus irgend einem Grund das Keyword c und der zugehörige Title 3):

    Keyword a,
    Title 1
         Title 3
    Keyword b,
         Title 2
    Keyword c,
    Title 3

    Sieht jemand vielleicht woran das liegt?

    Probiere es so:

    <xsl:for-each select="REF[count(. | key('REF-by-KEYWORD', KEYWORDS/KEYWORD)[1+position()]) = 1]">
    <xsl:value-of select="KEYWORDS/KEYWORD"/>,<br/>
    <xsl:for-each select="key('REF-by-KEYWORD', KEYWORDS/KEYWORD[1])">
    &#160;<xsl:value-of select="TITLE"/><br/>
    </xsl:for-each>
    </xsl:for-each>

    MfG, Thomas

  2. Danke für die Antwort. Aber wenn man im Title 3 die KEYWORD-Tags vertauscht, also zuerst a und dann c, dann erscheint im Ergebnis das Keyword c nicht mehr, und dafür Keyword a doppelt.