Mittwoch, 18. Juli 2007

Datum aus RSS-Feed mit XSLT konvertieren

Möchte man einen RSS-Feed mittels XSLT in HTML transformieren, dann stellt das im Prinzip kein Problem dar. Der einzige Knackpunkt ist das Datum der einzelnen Einträge. Dieses wird nämlich nach den Regeln zu Datum und Uhrzeit in der Spezifikation RFC 822 angegeben.

Beispiel:
<pubDate>Tue, 17 Jul 2007 13:55:00 GMT</pubDate>

Möchte man nun dieses Datum im Format "17.07.2007" ausgeben, ist dies mit Hilfe von XSLT 1.0 nicht ganz so einfach, gerade wenn man keine externen Bibliotheken wie EXSLT verwenden möchte. Hier bedarf es eines kleinen Workarounds.

Die Lösung basiert auf der Idee, dass man mit Hilfe von XPath-Funktionen die einzelnen Werte die man benötigten aus der Gesamtzeichenkette extrahiert - in diesem Beispiel wären das die Werte "17", "Jul" und "2007". Danach muss man nur noch den Monatswert "Jul" in einen numerischen Wert umwandeln.

Der fertige XSLT-Quelltext sieht dann so aus:
(wobei ich hier von der Struktur eines RSS 2 Feeds ausgehe)

<?xml version="1.0" encoding="ISO-8859-15"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-15" indent="yes"/>
<xsl:template match="/">
<ul>
<xsl:for-each select="/rss/channel/item">
<li>
<xsl:variable name="day" select="substring-before(substring-after(pubDate, ' '), ' ')"/>
<xsl:variable name="month" select="substring-before(substring-after(substring-after(pubDate, ' '), ' '), ' ')"/>
<xsl:variable name="monthNumber">
<xsl:if test="$month = 'Jan'">01</xsl:if>
<xsl:if test="$month = 'Feb'">02</xsl:if>
<xsl:if test="$month = 'Mar'">03</xsl:if>
<xsl:if test="$month = 'Apr'">04</xsl:if>
<xsl:if test="$month = 'May'">05</xsl:if>
<xsl:if test="$month = 'Jun'">06</xsl:if>
<xsl:if test="$month = 'Jul'">07</xsl:if>
<xsl:if test="$month = 'Aug'">08</xsl:if>
<xsl:if test="$month = 'Sep'">09</xsl:if>
<xsl:if test="$month = 'Oct'">10</xsl:if>
<xsl:if test="$month = 'Nov'">11</xsl:if>
<xsl:if test="$month = 'Dec'">12</xsl:if>
</xsl:variable>
<xsl:variable name="year" select="substring-before(substring-after(substring-after(substring-after(pubDate, ' '), ' '), ' '), ' ')"/>
<xsl:value-of select="format-number($day, '00')"/>.<xsl:value-of select="format-number($monthNumber, '00')"/>.<xsl:value-of select="$year"/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>

Ich habe hier übrigens nicht mit der XPath-Funktion substring() gearbeitet - sondern mit substring-before() und substring-after() - da die Werte die "herausgefiltert" werden sollen unterschiedliche Längen haben können. So kann zum Beispiel das Jahr in einem RSS-Feed vierstellig, aber auch zweistellig angegeben werden.

Keine Kommentare:

Kommentar veröffentlichen