MudGuard: Maximalwert(e)

Hi,

folgende Struktur ist gegeben:
Beispiel 1:
<persons>
  <person name="bla" events="e02 e04" />
  <person name="blubb" events="e01 e03 e05 e07" />
  <person name="laber" events="e03 e06 e07"/>
</persons>

oder
Beispiel 2:
<persons>
  <person name="bla" events="e02 e04" />
  <person name="blubb" events="e01 e03 e05 e07" />
  <person name="laber" events="e03 e06 e07"/>
  <person name="schwafel" events="e01 e02 e04 e07" />
</persons>

Also Personen sowie events, die events-Attribute sind immer aus 3-stelligen ids aufgebaut (e + 2 Ziffern) und immer mit genau einem Leerzeichen zwischen den ids.
D.h. die Länge des Strings ist direkt abhängig von der event-Anzahl.

Jetzt will ich an einer Stelle des erzeugten Dokuments das name-Attribut sowie die Anzahl der Events ausgeben.
Soweit noch kein Problem:
<xsl:template match="person" mode="maxmeet">
<li><xsl:value-of select="@name"/>: <xsl:value-of select="number(string-length(@events) + 1) div 4"/></li>
</xsl:template>

aufgerufen per
<ul><xsl:apply-templates select="persons" mode="maxmeet"/></ul>

Klappt auch - ich bekomme jetzt eine Liste _aller_ persons mit der Anzahl der events.

Jetzt kommt aber noch eine kleine Bedingung dazu, und da steht jetzt irgendwie ein Wald zwischen mir und den Bäumen, die ich sehen will:

Ich hätte die Liste gerne reduziert auf die persons, die am meisten events besucht haben.
Im ersten Beispiel also
blubb: 4
im zweiten Beispiel:
blubb: 4
schwafel: 4

Wie kann ich die Liste auf die Eintröge mit der maximalen Anzahl events (i.e. mit der maximalen string-length(@events)) begrenzen?

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter
O o ostern ...
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  1. Hallo,

    Jetzt will ich an einer Stelle des erzeugten Dokuments das name-Attribut sowie die Anzahl der Events ausgeben.
    Soweit noch kein Problem:
    <xsl:template match="person" mode="maxmeet">
    <li><xsl:value-of select="@name"/>: <xsl:value-of select="number(string-length(@events) + 1) div 4"/></li>
    </xsl:template>

    Ausgehend vom http://aktuell.de.selfhtml.org/tippstricks/xml/gruppierung1/index.htm

    <li><xsl:value-of select="@name"/>: <xsl:value-of select="count(id(@events))"/></li>

    Ich hätte die Liste gerne reduziert auf die persons, die am meisten events besucht haben.

    Ausgehend vom http://aktuell.de.selfhtml.org/tippstricks/xml/gruppierung1/index.htm

    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE activity [
       <!ELEMENT event EMPTY>
       <!ATTLIST event id   ID    #REQUIRED>
    ]>
    <activity>
    ...
    </activity>

    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
     <xsl:output
      method="html"
      encoding="iso-8859-1"
      doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
      indent="yes" />
     <xsl:template match="/activity">
     <html>
      <head>
       <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
       <title>Veranstaltungen und Teilnehmer</title>
      </head>
      <body>
       <h2>Teilnehmer mit höchster Anz. von Veranst.</h2>
       <xsl:apply-templates select="participants" mode="highest" />
      </body>
     </html>
     </xsl:template>

    <xsl:template match="participants" mode="highest">
      <xsl:variable name="highestnumberofevents">
       <xsl:for-each select="participant">
        <xsl:sort select="count(id(@events))" data-type="number" order="descending" />
        <xsl:if test="position() = 1">
         <xsl:value-of select="count(id(@events))" />
        </xsl:if>
       </xsl:for-each>
      </xsl:variable>
      <ul>
       <xsl:for-each select="participant">
        <xsl:sort select="count(id(@events))" data-type="number" order="descending" />
        <xsl:variable name="numberofevents" select="count(id(@events))" />
        <xsl:if test="$numberofevents = $highestnumberofevents">
         <li>
          <xsl:value-of select="@name"/>: <xsl:value-of select="$numberofevents" />
         </li>
        </xsl:if>
       </xsl:for-each>
      </ul>
     </xsl:template>
    </xsl:stylesheet>

    Grüße
    Thomas

    1. Hi,

      Danke - ich werd das analysieren (aber nicht mehr heute - zu viel Ethanol in mir ...)

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.