BlogBabel API – Giochiamo con XSL

Leggevo sul blog di blogbabel che sono disponibili in versione beta della API. Conscio del fatto che molto probabilmente sarà lavoro buttato al vento (cambieranno velocemente), mi sono messo un po’ a giocarci, cercando di integrarli con un foglio di stile XSL.

Per quei due o tre che non lo sapessero, il formato eXtensible Stylesheet Language è il linguaggio che descrive i fogli di stile applicabili a file con output XML. E le API di BlogBabel sono disponibili anche in questo formato. Anzi, è proprio quello di default.

La struttura del file XML che mette a disposizione al momento BlogBabel è molto semplice. Ma allo stesso tempo difficile da leggere per chi non ha confidenza con certe cose. E’ molto meglio leggere il file in questo modo πŸ™‚

[MORE]

 

Come farlo? Beh, per prima cosa consideriamo che il file da leggere non sta nel nostro server. Non abbiamo la disponibilità del sorgente. Ma dobbiamo fare in modo di poterlo monipolare.

Usando un qualsiasi programma server side che permetta l’including di file remoti, possiamo fare in modo di leggere il file come se fosse nostro a tutti gli effetti.

Come mio solito, ho usato il PHP.

<?php
  header (‘Content-Type: text/xml’);
  include ‘http://it.blogbabel.com/api/v1/blog/davidonzos-blog/’;
?>

L’header così impostato mi permette di non perdere la notazione xml. A questo punto devo creare un file XSL che sia in grado di manipolare i dati presenti nel foglio XML e presentarmeli in veste "più umana".

Creiamo un nuovo file, chiamiamolo xsl.xsl, e cominciamo a scriverlo πŸ™‚ . Per prima cosa, i file XSL sono in formato XML. Si dichiarano come fogli di stile e definiscono immediatamente il loro output. Le prime righe saranno quindi qualcosa del genere.

<?xml version=’1.0′ encoding=’UTF-8′?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="iso-8859-1" version="4.01" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>

Subito dopo il primo fondamentale comando XSL. Il matching della radice principale del foglio XML.

Nel caso delle API di BlogBabel (ripeto, sono in beta, per cui la cosa è da prendere con le molle!) la radice primaria è blog, che fra l’altro non contiene valori propri.

Possiamo quindi stabilire come matching principale:

<xsl:template match="/blog">

Badate bene, avremmo potuto scrivere egualmente:

<xsl:template match="/">

Ma per la selezione dei valori avremmo dovuto scrivere l’albero partendo da /blog, in questo modo.

<xsl:value-of select="/blog/name"/>

Invece, sfruttando l’attuale struttura del foglio XML, possiamo definire il matching principale in /blog ed estrarre i valori con albero più ristretto. In questo modo.

<xsl:value-of select="name"/>

Avrete già capito che per estrarre un valore tipo:

<valore>ciao</valore>

Basterà dare come istruzione:

<xsl:value-of select="valore"/>
Facendo partire la dicitura di select da subito dopo il matching di template indicato. Nell’esempio proposto l’istruzione data ritornerà a schermo la parola "ciao".

E sarà proprio questo il metodo con cui si estrarranno i valori. Tutto il resto del file potrà essere trattato come un comunissimo file html. Dovremo quindi aprire i tag <html>, <head>, <title>, <body> e chiuderli adeguatamente. Possiamo linkare o incorporare un foglio si stile CSS.

Di seguito uno schema striminzito, ma esaustivo, di foglio di stile XSL.

<?xml version=’1.0′ encoding=’UTF-8′?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="iso-8859-1" version="4.01" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
<xsl:template match="/blog">
 <html>
  <head>
   <style>
    Qui lo stile
   </style>
   <title>
    Qui il titolo
   </title>
  </head>
  <body>
    Il corpo del file, con trattamento dati XML
  </body>
 </html>
</xsl:template>
</xsl:stylesheet>

La gestione dei cicli.

XSL supporta anche questo! Esattamente come fareste usando qualsiasi altro linguaggio di programmazione, potete impostare risultanze diverse a diverse situazioni.

Ad esempio, nella API di BlogBabel io voglio un testo diverso in funzione del fatto che l’elemento trend (la variazione rispetto all’ultimo aggiornamento) sia positivo, negativo, uguale a 1 oppure a -1.

Ecco come fare nello specifico:

<xsl:choose>
 <xsl:when test="trend > 0">
   Il ranking e’ aumentato di
     <xsl:choose>
        <xsl:when test="trend = 1">
           <b>una posizione</b>
        </xsl:when>
        <xsl:otherwise>
           <b><xsl:value-of select="trend"/> posizioni</b>
        </xsl:otherwise>
     </xsl:choose>
 </xsl:when>
 <xsl:otherwise>
   Il ranking e’ diminuito di
     <xsl:choose>
       <xsl:when test="trend = -1">
           <b>una posizione</b>
       </xsl:when>
       <xsl:otherwise>
           <b><xsl:value-of select="substring(trend,2)"/> posizioni</b>
       </xsl:otherwise>
     </xsl:choose>
 </xsl:otherwise>
</xsl:choose>
rispetto all’ultimo aggiornamento.

E’ un po’ incasinato e si sarebbe potuto scrivere meglio, ma a livello didattico va bene perchè prende in considerazione un buon albero di casistica valori.

xsl:choose: corrisponde al switch del php.

xsl:when: quando si verifica un dato evento.

xsl:otherwise: se si verifica un evento diverso da quello dichiarato in xsl:when.

Non dimenticate la sintassi di xsl:when:

<xsl:when test="condizione">
Evento in caso di positività
</xsl:when>

Creare Attributi

Spesso è utile a volte è necessario. Per scrivere XML corretto dobbiamo evitare cose di questo genere:

<a href="<xsl::value-of select="slug"/>">Ancora</a>


Questo codice è errato e farà andare in errore tutta la pagina.
Per evitare la cosa creiamoci un riferimento per l’attributo href.

<xsl:attribute name="href"><xsl:value-of select="url"/></xsl:attribute>
Creato l’attributo posso scrivere il link senza tanti problemi πŸ™‚

<a href="{url}" ><xsl:value-of select="name"/></a>

Dopo aver creato con successo il foglio XSL. Integratelo nel file php che avevamo creato all’inizio.

<?php
  header (‘Content-Type: text/xml’);
  echo ‘<?xml-stylesheet href="xsl.xsl" type="text/xsl" media="screen"?>’;
  include ‘http://it.blogbabel.com/api/v1/blog/davidonzos-blog/’;
?>

Il risultato di tutto questo gran papocchio sconfusionato lo trovate qui. Potrebbe non funzionare da un momento all’altro, dato che le API di blogbabel sono in beta, ed a giudicare dalla velocità del team che gestisce la classifica, il tutto sarà da rifare molto presto πŸ™‚

Per lo stesso motivo non vi faccio scaricare niente. Anzi, visto che i tenutari di blogbabel avevano chiesto un uso non intensivo delle API, questo articolo potrebbe scomparire presto πŸ˜‰

2 thoughts on “BlogBabel API – Giochiamo con XSL”

  1. We non me la buttare sul cambiamento delle api che da quasi un mese funziona tutto bene (il plugin per il rankcheck) e se domani le cambiano ti vengo a cercare πŸ˜›

    Per evitare troppe query basta implementare un caching di diciamo 12/24 ore e sei a posto πŸ˜‰

  2. Ma sul blog di blogbabel dicono che le cambieranno presto. Sono in beta πŸ˜›

    Al momento per come è stato pensato non c'è caching. Ma lo sto implementando ora con un sistema che scarica l'XML ogni 8 ore.

    Se ce la faccio lo posto entro stasera πŸ™‚

Comments are closed.