Robert: Sortierungs-Problem

Beitrag lesen

Hallöle,

ich verzweifle gerade an einer Sortierung bei einer XSLT-Ausgabe.

Hier erstmal das XML:

  
<?xml version="1.0" encoding="iso-8859-1"?>  
<orteundtouristen>  
    <orte>  
        <ort id="ort01" name="aachen" />  
        <ort id="ort02" name="berlin" />  
        <ort id="ort03" name="coburg" />  
        <ort id="ort04" name="dueren"/>  
        <ort id="ort05" name="erfurt"/>  
    </orte>  
    <spezialorte orte="ort01 ort03 ort05"/>  
    <touristen>  
        <tourist name="anton" orte="ort01 ort02"/>  
        <tourist name="berta" orte="ort01 ort03 ort05"/>  
        <tourist name="claus" orte="ort02 ort04"/>  
        <tourist name="danny" orte="ort03 ort04"/>  
        <tourist name="erwin" orte="ort01 ort03 ort04"/>  
        <tourist name="freda" orte="ort01 ort02 ort04"/>  
        <tourist name="georg" orte="ort04"/>  
    </touristen>  
</orteundtouristen>  

So, jetzt möchte ich eine Liste der Touristen, die mindestens einen der Spezialorte besucht haben, wobei zu jedem dieser Touristen die Anzahl der besuchten Spezialorte sowie deren id und name ausgegeben wird.

Ok, auch noch kein großes Problem.

Mit

  
<?xml version="1.0" encoding="iso-8859-1"?>  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
<xsl:output method="text" indent="yes" encoding="iso-8859-1"/>  
  
<xsl:template match="/">  
    <xsl:apply-templates select="orteundtouristen/touristen/tourist">  
        <xsl:sort select="@name"/>  
    </xsl:apply-templates>  
</xsl:template>  
  
<xsl:variable name="diespezialorte" select="//spezialorte/@orte"/>  
  
<xsl:template match="tourist">  
    <xsl:variable name="dieorte" select="@orte"/>  
    <xsl:variable name="besuchtespezialorte" select="//ort[contains($dieorte,@id) and contains($diespezialorte,@id)]"/>  
  
    <xsl:if test="count($besuchtespezialorte)">  
        <xsl:value-of select="@name"/>  
        <xsl:text> </xsl:text>  
        <xsl:value-of select="count($besuchtespezialorte)"/>  
        <xsl:apply-templates select="$besuchtespezialorte"/>  
        <xsl:text>&#10;</xsl:text>  
    </xsl:if>  
</xsl:template>  
  
<xsl:template match="ort">  
    <xsl:text> </xsl:text>  
    <xsl:if test="position() = 1">(</xsl:if>  
    <xsl:value-of select="@id"/>  
    <xsl:text> </xsl:text>  
    <xsl:value-of select="@name"/>  
    <xsl:if test="not(position() = last())">  
        <xsl:text>,</xsl:text>  
    </xsl:if>  
    <xsl:if test="position() = last()">)</xsl:if>  
</xsl:template>  
  
<xsl:template match="*"/> <!-- alles unterdruecken, was nicht ausdruecklich erwuenscht ist -->  
</xsl:stylesheet>  

bekomme ich die gewünschten Daten in der Form

anton 1 (ort01 aachen)
berta 3 (ort01 aachen, ort03 coburg, ort05 erfurt)
danny 1 (ort03 coburg)
erwin 2 (ort01 aachen, ort03 coburg)
freda 1 (ort01 aachen)

ausgegeben. Das ist schon fast das Gewünschte, was noch fehlt, ist die Sortierung nach der Anzahl. Ich hätte also gerne

berta 3 (ort01 aachen, ort03 coburg, ort05 erfurt)
erwin 2 (ort01 aachen, ort03 coburg)
anton 1 (ort01 aachen)
danny 1 (ort03 coburg)
freda 1 (ort01 aachen)

Ich weiß zwar, wo das zusätzliche xsl:sort hin muß:

  
<xsl:template match="/">  
    <xsl:apply-templates select="orteundtouristen/touristen/tourist">  
        <xsl:sort select="wasauchimmer" data-type="number" order="descending"/>  
        <xsl:sort select="@name"/>  
    </xsl:apply-templates>  
</xsl:template>  

Nur weiß ich nicht, was ich anstelle des "wasauchimmer" angeben muß.
Die Zahl kann ich ja nicht so wie ein Kind-Element oder Attribut selektieren, die wird ja nur in dem angewendeten Template erzeugt.

Wie krieg ich das hin?
Oder geht das gar nicht?

cu,
Robert