Kerstin: format-date für 1.0 und nur höchster Wert ausgeben

Hallo,

ich hab schon ein wenig gegoogelt und auch hier die Forumssuche bemüht. Leider aber zu obigen Themen nichts gefunden.

Ich hab mir in meinem XML-Schema folgendes Element definiert
     <xsd:element name="date" type="xsd:data"/>

Diese Definition verlangt es in der XML-Datei folgende Angabe für ein Datum zu machen:
     <date>2006-03-21</date>

Soweit so gut. Allerdings möchte ich bei der späteren Umwandlung per XSL, die Anzeige des Datums als 21.03.2006 erreichen. XSLT 2.0 stellt die Funktion format-date($date, "[D].[M].[Y]") bereit. Leider habe ich noch keinen XSLT-Prozessor gefunden, der das auch unterstützt. xsltproc unterstützt nur XSLT 1.0. Deshalb meine Frage: Gibt es eine andere Möglichkeit dies zu erreichen?

Eine andere Möglichkeit wäre natürlich die Definition des Elements <date> ganz einfach ändern. Dann wäre auch 21.03.2006 möglich. Allerdings wäre es dann doch etwas schwierig aus dieser Angabe einen höchsten Wert heraus zu bekommen.
Also ich habe mehrere Angaben like
<date>2006-03-20</date>
<date>2006-03-21</date>
oder eben
<date>20.03.2006</date>
<date>21.03.2006</date>

Und im XSL dann?
<xsl:for-each select="date">
  <xsl:value-of select="."/>
</xsl:for-each>
Das gibt mir alle Werte aus, aber nicht den höchsten. Wie mach ich das am Besten? Geht das überhaupt?

Interessant wäre das nicht nur bei einem Datumswert sondern allgemein z.B. bei einem Dezimalwert wie z.B.
<number>0.1</number>
<number>1.5</number>

Und im XSL dann?
<xsl:for-each select="number">
  <xsl:value-of select="."/>
</xsl:for-each>

Gruß,
Kerstin

  1. Hallo Kerstin,

    kannst du denn nicht auf substring() Funktion zurückgreifen? Dann könntest du doch dass Datum erst einmal auseinanderlegen und dann wieder zusammenbauen nach deinem Wunsch mit concat()

    http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#substring

    Gruß,

    Holger

    1. Hallo Holger,

      http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#substring

      Ach, da stehen die ganzen Funktionen *an den Kopf fass*

      Vielleicht sollte das Kapitel-Bezeichnung nicht nur XML/DTD sondern auch noch XSL enthalten bzw. XPath. Deshalb hab ich da nicht reingeguggt. Früher standen da nämlich wirklich nur XML/DTD drin, glaube ich zumindest. Naja, egal ... Jetz hab ichs ja gefunden.

      Danke Holger.
      Gruß,
      Kerstin

      1. Alles zu XSL steht unter "Darstellung von XML" bei selfhtml.org . Über den Titellink kann man sich streiten. Na ja, der Link anbei, falls du mal nicht nur die Funktionen sondern auch Xpath Syntax und andere XSL Elemente benötigst ;-)

        http://de.selfhtml.org/xml/darstellung/index.htm

        Gruß,

        Holger

        1. Alles zu XSL steht unter "Darstellung von XML" bei selfhtml.org . Über den Titellink kann man sich streiten. Na ja, der Link anbei, falls du mal nicht nur die Funktionen sondern auch Xpath Syntax und andere XSL Elemente benötigst ;-)

          http://de.selfhtml.org/xml/darstellung/index.htm

          Gruß,

          Holger

          Danke nochmal Holger. Hab schon gesehen. Werd mich da auch bei Bedarf durchscrollen. Nun bin ich aber so gut wie durch mit XSL ... Naja, muss mich sicher in naher Zukunft nochmal damit auseinander setzen.

          Gruß,
          Kerstin

  2. Hallo,

    Gibt es eine andere Möglichkeit dies zu erreichen?

    Zeichenketten-Funktionen bieten sich an:

      
    <xsl:value-of select="concat(substring(date,9,2),'.',substring(date,6,2),'.',substring(date,1,4))"/>
    

    Und im XSL dann?
    <xsl:for-each select="date">
      <xsl:value-of select="."/>
    </xsl:for-each>
    Das gibt mir alle Werte aus, aber nicht den höchsten. Wie mach ich das am Besten? Geht das überhaupt?

    Probiere es mal damit:

      
    <xsl:for-each select="date">  
      <xsl:sort select="." data-type="text" order="descending"/>  
        <xsl:if test="position()=1">  
          <xsl:value-of select="."/>  
        </xsl:if>  
    </xsl:for-each>
    

    Mit dem Testcase

      
    <date>2006-03-12</date>  
    <date>2006-12-03</date>  
    <date>2005-12-31</date>
    

    wird 2005-12-03 als hoechstes Datum erhalten. Beim Arbeiten mit data-type="number" muessten weitere Umrechungen der einzelnen Komponenten (etwa in Sekunden) getaetigt werden.

    MfG, Thomas

    1. [Korrektur:]

      wird 2005-12-03 als hoechstes Datum erhalten.

      ^
              2006-12-03

      MfG, Thomas

    2. Hallo Thomas,

      ich danke Dir. Echt geniale Sache. Hatte schon gedacht, dass das gar nicht geht, weil mir diese Funktionen (substring, position, ...) noch unbekannt waren. Mit diesen Funktionen ist das nun natürlich alles klar.

      Gruß,
      Kerstin

  3. Hello out there!

    <date>2006-03-21</date>
    Soweit so gut. Allerdings möchte ich bei der späteren Umwandlung per XSL, die Anzeige des Datums als 21.03.2006 erreichen.

    Ähm, warum eigentlich?

    Das Datumsformat 'YYYY-MM-DD' nach ISO 8601 ist bei uns das nach Norm DIN 5008 gültige.

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)