benni: xslt, count mit Bedingung

Hallo,

Ich habe schon ein Thema vor 2 Tagen erstellt, leider hat niemand geantwortet. Ich muss zugeben, die Beschreibung des Problems war auch nicht wirklich weiterführend. Deshalb jetzt nochmal:

Ich habe eine xml datei. In der xml-Datei werden mir zu einer Person die verschiedene Termine aufgelistet:

  
<Person>  
 <Name>Mustermann</Name>  
 ...  
 <Termine>  
   <Termin>  
     <Date>01.01.2008</Date>  
   </Termin>  
   <Termin>  
     <Date>15.01.2008</Date>  
   </Termin>  
   <Termin>  
     <Date>20.02.2008</Date>  
   </Termin>  
 </Termine>  
</Person>  
<Person>  
...  
</Person>  

Mittels xslt möchte ich neben den Informationen zur Person auch die Anzahl der Termine pro Monat abfragen. Für "Mustermann" soll dann raukommen: Im Januar 2 Termin im Februar 1 Termin usw.
Mein Versuch dreht sich bislang um folgenden code (Für Januar):

  
<xsl:for-each select="Termine/Termin">  
 <xsl:if test="01 = substring(Date,4,2)">  
   <xsl:value-of select="count(Date)"/>  
 </xsl:if>  
</xsl:for-each>  

Leider gibt mir die Transformation dann folgendes aus: 11 - er prüft die Bedinung für jeden einzelnen Tag Termin und zählt dann die Ergebnisse zusammen, aber nicht für alle Termin-Tags. Ich bin am verzweifeln. Muss ich mit einer Variable arbeiten und wenn ja wie?

Gruß
benni

  1. Hallo benni,

    Mein Versuch dreht sich bislang um folgenden code (Für Januar):

    <xsl:for-each select="Termine/Termin">
    <xsl:if test="01 = substring(Date,4,2)">
       <xsl:value-of select="count(Date)"/>
    </xsl:if>
    </xsl:for-each>

      
    
    > Leider gibt mir die Transformation dann folgendes aus: 11 - er prüft die Bedinung für jeden einzelnen Tag Termin und zählt dann die Ergebnisse zusammen, aber nicht für alle Termin-Tags.  
      
    Ansatz:  
    ~~~xml
    <xsl:template match="Person">  
      <p><xsl:value-of select="Name"/>  
        <xsl:variable name="anzahl" select="count(Termine/Termin[substring(Date,4,2)='01'])"/>  
        <xsl:if test="$anzahl > 0">  
          <br /><xsl:text>01: </xsl:text><xsl:value-of select="$anzahl"/>  
        </xsl:if>  
      
        <xsl:variable name="anzahl" select="count(Termine/Termin[substring(Date,4,2)='02'])"/>  
        <xsl:if test="$anzahl > 0">  
          <br /><xsl:text>02: </xsl:text><xsl:value-of select="$anzahl"/>  
        </xsl:if>  
      </p>  
    </xsl:template>
    

    Grüße,
    Thomas

    1. Hallo benni,

      Mein Versuch dreht sich bislang um folgenden code (Für Januar):

      <xsl:for-each select="Termine/Termin">
      <xsl:if test="01 = substring(Date,4,2)">
         <xsl:value-of select="count(Date)"/>
      </xsl:if>
      </xsl:for-each>

      
      >   
      > > Leider gibt mir die Transformation dann folgendes aus: 11 - er prüft die Bedinung für jeden einzelnen Tag Termin und zählt dann die Ergebnisse zusammen, aber nicht für alle Termin-Tags.  
      >   
      > Ansatz:  
      > ~~~xml
      
      <xsl:template match="Person">  
      
      >   <p><xsl:value-of select="Name"/>  
      >     <xsl:variable name="anzahl" select="count(Termine/Termin[substring(Date,4,2)='01'])"/>  
      >     <xsl:if test="$anzahl > 0">  
      >       <br /><xsl:text>01: </xsl:text><xsl:value-of select="$anzahl"/>  
      >     </xsl:if>  
      >   
      >     <xsl:variable name="anzahl" select="count(Termine/Termin[substring(Date,4,2)='02'])"/>  
      >     <xsl:if test="$anzahl > 0">  
      >       <br /><xsl:text>02: </xsl:text><xsl:value-of select="$anzahl"/>  
      >     </xsl:if>  
      >   </p>  
      > </xsl:template>
      
      

      Grüße,
      Thomas

      Ok, Super! Klappt auch. Ich hab derweil zwar auch schon einen weg gefunden. Die Ergebnisse weichen ja nicht sonderlich von einander ab..

      <xsl:value-of select="count(//Date[substring(.,4,2) = '01'])"/>

      Jetzt muss ich das ganze nur noch rollierend hinbekommen. Soll heißen, für die letzten 12 Monate soll er mir die Ergebnisse anzeigen. Also für heute: ab Oktober 2007 bis September 2008. Dazu hab ich in der xml noch einen Tag <created> - das gibt mir das aktuelle Datum aus. Derzeit ist das ganze bei mir noch ein bisschen unelegant, da ich 12 Prüfungen drinn habe und dann die jeweilige bei Übereinstimmung nutze:

      Die Variable Monat1 ist aus <created>:

      <xsl:when test="$Monat1=01">  
       <xsl:value-of select="count(//Date[substring(.,4,2) = '01'])"/>  
              <xsl:text> </xsl:text>  
       <xsl:value-of select="count(//Date[substring(.,4,2) = '02'])"/>  
              ...  
        
      </xsl:when>  
      <xsl:when test="$Monat1=02">  
       <xsl:value-of select="count(//Date[substring(.,4,2) = '02'])"/>  
       <xsl:text> </xsl:text>  
       <xsl:value-of select="count(//Date[substring(.,4,2) = '03'])"/>
      

      usw. das geht bestimmt noch besser. Aber funktional ist es allemal..

      1. Hallo Benni,

        Jetzt muss ich das ganze nur noch rollierend hinbekommen. Soll heißen, für die letzten 12 Monate soll er mir die Ergebnisse anzeigen. Also für heute: ab Oktober 2007 bis September 2008. Dazu hab ich in der xml noch einen Tag <created> - das gibt mir das aktuelle Datum aus.

        Noch ein Hinweis: Falls das Gespann XSLT/XPath 2.0 einsetzbar ist, ergeben sich erweiterte Möglichkeiten zum Umgang mit dem Datum, speziell die Abfrage des aktuellen Datums und Rechenoperationen mit Zeitperioden (Beispiele).

        Grüße,
        Thomas

        1. Hallo Benni,

          Jetzt muss ich das ganze nur noch rollierend hinbekommen. Soll heißen, für die letzten 12 Monate soll er mir die Ergebnisse anzeigen. Also für heute: ab Oktober 2007 bis September 2008. Dazu hab ich in der xml noch einen Tag <created> - das gibt mir das aktuelle Datum aus.

          Noch ein Hinweis: Falls das Gespann XSLT/XPath 2.0 einsetzbar ist, ergeben sich erweiterte Möglichkeiten zum Umgang mit dem Datum, speziell die Abfrage des aktuellen Datums und Rechenoperationen mit Zeitperioden (Beispiele).

          Grüße,
          Thomas

          Hallo Thomas,

          danke für den Hinweis. Ich weiß leider nicht genau, ob das Ausgabeprogramm xpath2.0 unterstützt. Xslt nutze ich damit bereits. Wie kann das herausfinden? Unterstüzt z.B. der IE 6 xpath2.0?

          Gruß
          Benni

          1. Hallo Benni,

            Xslt nutze ich damit bereits. Wie kann das herausfinden? Unterstüzt z.B. der IE 6 xpath2.0?

            Die Browser sind noch auf 1.0-Niveau. XSLT/XPath 2.0 wird von den aktuellen Versionen der Prozessoren Saxon, AltovaXML und Gestalt unterstützt.

            Grüße,
            Thomas

  2. Hallo,

    Es gibt Zeiten - wie jetzt z.B. - da ich mich ärgere, wen ich das Forum - wie üblich - von unten nach oben durchlese.

    Grüße
    Thomas