Weltliche und religiöse Feiertage ermitteln

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie würden gern wissen, ob an einem bestimmten Datum ein Feiertag ist.

Lösung

Die erste Art von Feiertag umfasst alle, die jedes Jahr auf den gleichen Tag fallen. Beispielsweise ist eine Funktion zum Ermitteln des amerikanischen Unabhängigkeitstages für ein beliebiges Jahr einfach:

<xsl:template name="ckbk:independence-day">
  <xsl:param name="year"/>
  <xsl:call-template name="ckbk:date-to-absolute-day">
    <xsl:with-param name="month" select="7"/>
    <xsl:with-param name="day" select="4"/>
    <xsl:with-param name="year" select="$year"/>
  </xsl:call-template>
</xsl:template>

Die zweite Art von Feiertag fällt relativ zum Anfang oder Ende eines Monats immer auf den gleichen Tag der Woche. Sie können diese Tage mit Hilfe des folgenden kleinen Programms ermitteln, das das Template k-day-on-or-before-abs-day aus dem Rezept Mit dem islamischen Kalender arbeiten nutzt:

<xsl:template name="ckbk:n-th-k-day">
  <!-- Das n-te Vorkommen von k im angegebenen Monat -->
  <!-- Positive n-Werte vom Anfang des Monats, negative vom Ende. -->
  <xsl:param name="n"/>
  <!-- k = der Wochentag (0 = Sonntag) -->
  <xsl:param name="k"/>
  <xsl:param name="month"/>
  <xsl:param name="year"/>
  <xsl:choose>
    <xsl:when test="$n &gt; 0">
      <xsl:variable name="k-day-on-or-before">
        <xsl:variable name="abs-day">
          <xsl:call-template name="ckbk:date-to-absolute-day">
            <xsl:with-param name="month" select="$month"/>
            <xsl:with-param name="day" select="7"/>
            <xsl:with-param name="year" select="$year"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:call-template name="ckbk:k-day-on-or-before-abs-day">
          <xsl:with-param name="abs-day" select="$abs-day"/>
          <xsl:with-param name="k" select="$k"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="$k-day-on-or-before + 7 * ($n - 1)"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:variable name="k-day-on-or-before">
        <xsl:variable name="abs-day">
          <xsl:call-template name="ckbk:date-to-absolute-day">
            <xsl:with-param name="month" select="$month"/>
            <xsl:with-param name="day">
              <xsl:call-template name="ckbk:last-day-of-month">
                <xsl:with-param name="month" select="$month"/>
                <xsl:with-param name="year" select="$year"/>
              </xsl:call-template>
            </xsl:with-param>
            <xsl:with-param name="year" select="$year"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:call-template name="ckbk:k-day-on-or-before-abs-day">
          <xsl:with-param name="abs-day" select="$abs-day"/>
          <xsl:with-param name="k" select="$k"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="$k-day-on-or-before + 7 * ($n + 1)"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Diese Funktion setzt den gregorianischen Kalender voraus. Falls Sie relative Daten innerhalb anderer Kalendersysteme ermitteln wollen, müssen Sie innerhalb dieser Systeme äquivalente Routinen schreiben.

Es ist nun einfach, Feiertage wie den American Labor Day und den Memorial Day zu ermitteln (der erste Montag im September bzw. der letzte Montag im Mai):

<xsl:template name="ckbk:labor-day">
  <xsl:param name="year"/>
  <xsl:call-template name="ckbk:n-th-k-day ">
    <xsl:with-param name="n" select="1"/>
    <xsl:with-param name="k" select="1"/>
    <xsl:with-param name="month" select="9"/>
    <xsl:with-param name="year" select="$year"/>
  </xsl:call-template>
</xsl:template>
<xsl:template name="ckbk:memorial-day">
  <xsl:param name="year"/>
  <xsl:call-template name="ckbk:n-th-k-day ">
    <xsl:with-param name="n" select="-1"/>
    <xsl:with-param name="k" select="1"/>
    <xsl:with-param name="month" select="5"/>
    <xsl:with-param name="year" select="$year"/>
  </xsl:call-template>
</xsl:template>

Es handelt sich zwar nicht um einen Feiertag, aber auf die gleiche Weise können auch die Anfangs- und Endtermine der amerikanischen Sommerzeit verarbeitet werden:

<xsl:template name="ckbk:day-light-savings-start">
  <xsl:param name="year"/>
  <xsl:call-template name="ckbk:n-th-k-day ">
    <xsl:with-param name="n" select="1"/>
    <xsl:with-param name="k" select="0"/>
    <xsl:with-param name="month" select="4"/>
    <xsl:with-param name="year" select="$year"/>
  </xsl:call-template>
</xsl:template>
<xsl:template name="ckbk:day-light-savings-end">
  <xsl:param name="year"/>
  <xsl:call-template name="ckbk:n-th-k-day ">
    <xsl:with-param name="n" select="-1"/>
    <xsl:with-param name="k" select="0"/>
    <xsl:with-param name="month" select="10"/>
    <xsl:with-param name="year" select="$year"/>
  </xsl:call-template>
</xsl:template>

Diskussion

Es ist unmöglich, alle weltlichen und religiösen Feiertage aller Länder und aller Jahre zu behandeln. Allerdings können Sie die meisten Feiertage in zwei Typen einteilen: solche, die jedes Jahr in ihren jeweiligen Kalendern auf den gleichen Tag fallen (z. B. US-amerikanischer Unabhängigkeitstag) und solche, die auf einen bestimmten Wochentag relativ zum Anfang oder Ende eines Monats fallen (z. B. US-amerikanischer Labor Day). Religiöse Feiertage sind in ihrem eigenen Kalendersystem oft einfach zu finden. Schwieriger wird es dann häufig, wenn man sie in einem anderen Kalendersystem ermitteln möchte. Beispielsweise fällt die orthodoxe Weihnacht immer auf den 25. Dezember des julianischen Kalenders. Das heißt, in einem gregorianischen Jahr kann die orthodoxe Weihnacht an den Anfang oder das Ende fallen oder überhaupt nicht auftauchen. Da wir nicht jeden religiösen Feiertag in jedem Glauben behandeln können, halten Sie sich bitte an die Referenzen, die in der Einleitung zu diesem Kapitel genannt wurden.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de