Samstag, 10. November 2007

BlogID und PostID aus RSS-Feed von Blogger.com per XSLT auslesen

Wenn man auf einer Webseite die Einträge aus einem Blog von Blogger.com anzeigen möchte, dann bietet sich dazu die Verwendung des zur Verfügung gestellten RSS-Feeds (wie dieser zum Beispiel) in Verbindung mit XSLT wunderbar an. Möchte man allerdings bei der Ausgabe auch einen Link zur Kommentar-Funktion für die einzelnen Blog-Einträge anzeigen, dann steht man vor dem Problem, dass in dem RSS-Feed die dazu benötigten Daten nicht in separaten Knoten (Nodes) stehen.

Doch eins nach dem anderen. Wie sieht nun zunächst der URL zur Kommentar-Seite eines Blog-Eintrags bei Blogger.com syntaktisch aus?

http://www.blogger.com/comment.g?blogID=NUMMER&postID=NUMMER

Variabel sind also die Angaben der Parameter "blogID" und "postID". Diese Daten findet man im RSS-Feed im Knoten (Node) "guid".

<guid isPermaLink='false'>
tag:blogger.com,1999:blog-5974424768978008959.post-7382480864588189143
</guid>

Mann muss also aus diesem Knoten (Node) die benötigten Daten extrahieren. Dies kann man mit XSLT und den XPath-Funktionen substring_before() und substring_after() realisieren. Ich habe hier nicht die XPath-Funktion substring() verwendet, da ich nicht weiß, ob sich die Länge der Werte irgendwann mal verändert.

"blog"-Wert extrahieren:
<xsl:variable name="blog" select="substring-before(substring-after(guid, 'blog-'), '.post-')"/>
<xsl:text>blog: </xsl:text><xsl:value-of select="$blog"/>

"post"-Wert extrahieren:
<xsl:variable name="post" select="substring-after(guid, 'post-')"/>
<xsl:text>post: </xsl:text><xsl:value-of select="$post"/>

Ich habe die Werte in Variablen gespeichert, um nun anhand dieser den Link auf die Kommentar-Funktion bequem erstellen zu können:

Link zur Kommentar-Funktion:
<a href="http://www.blogger.com/comment.g?blogID={$blog}&amp;postID={$post}">
Kommentar schreiben
</a>

Der gesamte XSLT-Quellcode sieht dann so aus:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-15" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="rss/channel/item">
<xsl:value-of select="title"/>
<br/>
<xsl:text>guid: </xsl:text><xsl:value-of select="guid"/>
<br/>
<br/>

<!-- blog -->
<xsl:variable name="blog" select="substring-before(substring-after(guid, 'blog-'), '.post-')"/>
<xsl:text>blog: </xsl:text><xsl:value-of select="$blog"/>
<!-- blog -->

<!-- post -->
<xsl:variable name="post" select="substring-after(guid, 'post-')"/>
<xsl:text>post: </xsl:text><xsl:value-of select="$post"/>
<!-- /post -->

<br/>
<br/>
<a href="http://www.blogger.com/comment.g?blogID={$blog}&amp;postID={$post}">
Kommentar schreiben
</a>
<hr/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Keine Kommentare:

Kommentar veröffentlichen