<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>diploD &#187; xsl</title>
	<atom:link href="http://www.diplod.it/tag/xsl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diplod.it</link>
	<description>by Davide Del Monte</description>
	<lastBuildDate>Fri, 13 Feb 2015 14:26:10 +0000</lastBuildDate>
	<language>it-IT</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Dataview che filtra per data gli elementi di una lista Sharepoint: che fatica!</title>
		<link>http://www.diplod.it/2009/12/28/dataview-che-filtra-per-data-gli-elementi-di-una-lista-sharepoint-che-fatica/</link>
		<comments>http://www.diplod.it/2009/12/28/dataview-che-filtra-per-data-gli-elementi-di-una-lista-sharepoint-che-fatica/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 23:35:24 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[Ajax e Javascript]]></category>
		<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[calendario]]></category>
		<category><![CDATA[dataview]]></category>
		<category><![CDATA[designer]]></category>
		<category><![CDATA[filtro]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[webpart]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=938</guid>
		<description><![CDATA[Il concetto è semplice: ho una lista calendario in Sharepoint e voglio ottenere una dataview in grado di filtrare gli avvenimenti occorsi in un dato intervallo di tempo. A cosa può servire? Immaginiamo che il calendario in questione serva per segnare le ferie degli utenti e qualcuno sia interessato a vedere quante persone sono in [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Il concetto è semplice: ho una lista calendario in Sharepoint e voglio ottenere una dataview in grado di filtrare gli avvenimenti occorsi in un dato intervallo di tempo.</strong> A cosa può servire? Immaginiamo che il calendario in questione serva per segnare le ferie degli utenti e qualcuno sia interessato a vedere quante persone sono in ferie oggi, oppure dal 25 dicembre al 6 gennaio, per organizzare meglio il proprio lavoro..</p>
<p>Che ci sarà di così difficile? Nulla, se non il fatto che WSS è davvero poco user friendly quando si tratta di date.</p>
<p>Le prime cose da sapere riguardano la manipolazione delle date con XSL, bisogna <a title="Date con XSL" href="http://msdn.microsoft.com/en-us/library/ms256099.aspx" target="_blank">partire dalle basi</a> e poi da <a title="Date con XSL - esempi" href="http://mdasblog.wordpress.com/2008/02/19/comparing-dates-in-sharepoint-using-xsl/" target="_blank">qualche esempio</a>. Le date gestite su Sharepoint sono la <em>@EventDate</em> (data di inizio) e la <em>@EndDate</em> (data fine) e vengono restituite generalmente nel formato seguente: <em>2009-25-19T11:15:02Z</em>.</p>
<p>Ovviamente l&#8217;ambiente di lavoro è <strong>Sharepoint Designer</strong>. Per prima cosa, una volta creata la nuova <strong>dataview</strong> webpart, bisogna associargli un form (una DataForm WebPart) tramite il quale passare gli intervalli di selezione delle date. Pubblico subito il codice sorgente di questo form:</p>
<p><span id="more-938"></span></p>
<p><code>&lt;SCRIPT type="text/javascript" src="dhtmlgoodies_calendar/dhtmlgoodies_calendar.js?random=20060118"&gt;&lt;/script&gt;<br />
&lt;link type="text/css" rel="stylesheet" href="dhtmlgoodies_calendar/dhtmlgoodies_calendar.css?random=20051112" media="screen"&gt;&lt;/LINK&gt;<br />
&lt;table&gt;<br />
&lt;script language="JavaScript"&gt;<br />
function setStartTimeNow()<br />
{<br />
var d = new Date();<br />
var currYear = d.getFullYear();<br />
var currMonth = d.getMonth() + 1;<br />
var currDate = d.getDate();<br />
var currHour = d.getHours();<br />
var currMin = d.getMinutes();<br />
timeA = currYear + "" + currMonth + "" + currDate + "0001";<br />
timeB = currYear + "" + currMonth + "" + currDate + "2359";<br />
theInputA = document.getElementById('dataa');<br />
theInputA.value = timeA;<br />
theInputB = document.getElementById('datab');<br />
theInputB.value = timeB;<br />
}<br />
&lt;/script&gt;<br />
&lt;tr&gt;&lt;td&gt;Data e ora Inizio: &lt;/td&gt;&lt;td&gt;&lt;td&gt;&lt;input id="dataa" type="text" value="" readonly name="<strong>T1</strong>"&gt;&lt;input type="button" value="Seleziona data e ora.." onclick="displayCalendar(document.getElementById('dataa'),'<strong>yyyymmddhhii</strong>',this,true)"&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;tr&gt;&lt;td&gt;Data e ora Fine: &lt;/td&gt;&lt;td&gt;&lt;td&gt;&lt;input id="datab" type="text" value="" readonly name="<strong>T2</strong>"&gt;&lt;input type="button" value="Seleziona data e ora.." onclick="displayCalendar(document.getElementById('datab'),'<strong>yyyymmddhhii</strong>',this,true)"&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;br/&gt;<br />
&lt;input type="button" value="Voglio sapere gli assenti di oggi.." onclick="setStartTimeNow()"/&gt;<br />
&lt;input type="button" value="Mostra Risultati" onclick="javascript:_SFSUBMIT_"/&gt;</code></p>
<p>Per creare questo form ho utilizzato il comodissimo javascript <strong><a title="Date Picker Javascript" href="http://www.dhtmlgoodies.com/index.html?page=calendarScripts" target="_blank">dhtmlgoodies_calendar</a></strong>, che permette di avere il classico calendarietto tramite il quale selezionare la data. La particolarità è che il formato della data passato all&#8217;input element del form è del tipo <em>yyyymmddhhii</em>, ovvero vengono passate data e ora sottoforma di numero. Ad esempio, la data 25/12/2009 &#8211; 13:52, viene passata come 200912251352. In questo modo sarà possibile confrontarla con altre date tramite gli operatori logici (maggiore, minore, uguale..).<br />
T1 e T2 sono i parametri del form che verranno connessi alla web part XML.</p>
<p>Veniamo ora al dunque della web part che deve mostrare i dati, tramite Sharepoint Designer è necessario attivare due parametri: che chiameremo per comodità T1 e T2 (esattamente come gli elementi del form).</p>
<p><img class="size-full wp-image-939 alignnone" title="spdesigner" src="http://www.diplod.it/wp-content/uploads/2009/12/spdesigner.png" alt="spdesigner" width="680" height="400" /></p>
<p>Una volta fatto ciò, il grosso del lavoro sta tutto nell&#8217;impostare correttamente il filtro attraverso una espressione XSL. Prima il codice, poi i commenti:</p>
<p><code>&lt;xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[ ( ddwrt:FormatDateTime(string(@EventDate) ,1033 ,'yyyyMMddHHmm') &amp;lt;= $T1 and ddwrt:FormatDateTime(string(@EndDate) ,1033 ,'yyyyMMddHHmm') &amp;gt;= $T1 )  or  ( ddwrt:FormatDateTime(string(@EventDate) ,1033 ,'yyyyMMddHHmm') &amp;lt;= $T2 and ddwrt:FormatDateTime(string(@EndDate) ,1033 ,'yyyyMMddHHmm') &amp;gt;= $T2 )  or  ( ddwrt:FormatDateTime(string(@EventDate) ,1033 ,'yyyyMMddHHmm') &amp;gt;= $T1 and ddwrt:FormatDateTime(string(@EndDate) ,1033 ,'yyyyMMddHHmm') &amp;lt;= $T2 ) ]"/&gt;</code></p>
<p>Cosa fa questa funzione? Posto che i parametri T1 e T2 identificano rispettivamente la data di inizio e la data di fine dell&#8217;intervallo di selezione (il periodo per cui vogliamo sapere chi era assente), il codice del filtro trasforma tutte le date nel formato numerico descritto sopra, e le confronta in base ai parametri T1 e T2, verificando se esistono eventi iniziati prima della data T1 e ancora in corso nell&#8217;intervallo [T1;T2], iniziati e conclusi all&#8217;interno dell&#8217;intervallo oppure iniziati in [T1;T2] e con conclusione dopo T2. In questo modo si ottiene la lista di tutti gli assenti all&#8217;interno di un determinato periodo, anche degli assenti per solo alcuni giorni e non per tutto l&#8217;intervallo stesso.</p>
<p><img class="alignnone size-full wp-image-947" title="webpart" src="http://www.diplod.it/wp-content/uploads/2009/12/maschera2.png" alt="webpart" width="600" height="336" /></p>
<p>Nota bene, in linea di massima anche questo filtro dovrebbe essere corretto:</p>
<p><code>&lt;xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[ ( substring(translate(translate(translate(translate(@EventDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;lt;= $T1 and substring(translate(translate(translate(translate(@EndDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;gt;= $T1 )  or  ( substring(translate(translate(translate(translate(@EventDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;lt;= $T2 and substring(translate(translate(translate(translate(@EndDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;gt;= $T2 )  or  ( substring(translate(translate(translate(translate(@EventDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;gt;= $T1 and substring(translate(translate(translate(translate(@EndDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;lt;= $T2 ) ]"/&gt;</code></p>
<p>La funzione <em>translate</em> depura la stringa della data dai vari caratteri e lascia solo 14 numeri, la funzione <em>substring</em> leva gli ultimi due numeri (relativi ai secondi dell&#8217;ora della data). Ma così non funziona, per un qualche strano motivo Sharepoint anticipa di un&#8217;ora la data di tutti gli eventi, e ciò che concettualmente era infallibile, decade durante la prova effettiva, con buona pace per tutto il tempo trascorso sopra a ragionarci.. Argh!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2009/12/28/dataview-che-filtra-per-data-gli-elementi-di-una-lista-sharepoint-che-fatica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sharepoint: feed reader RSS con XML webpart</title>
		<link>http://www.diplod.it/2009/09/29/sharepoint-feed-reader-rss-con-xml-webpart/</link>
		<comments>http://www.diplod.it/2009/09/29/sharepoint-feed-reader-rss-con-xml-webpart/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 12:52:02 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[reader]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[web part]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=855</guid>
		<description><![CDATA[Creare una webpart Sharepoint che legga un feed RSS? Si può fare, basta utilizzare una XML Web Part, dalla gallery standard e scrivere qualche riga di codice XSL.
Sharepoint si conferma quindi un prodotto estremamente adattabile, anche se dal punto di vista dell'elaborazione dei feed mi sarei aspettato qualcosa di più. Va detto che in giro si trovano diversi strumenti per giocare coi feed in un sito sharepoint.]]></description>
				<content:encoded><![CDATA[<p><strong>Creare una webpart Sharepoint che legga un feed RSS?</strong> Si può fare, basta utilizzare una XML Web Part, dalla gallery standard e scrivere qualche riga di codice XSL.<br />
Sharepoint si conferma quindi un prodotto estremamente adattabile, anche se dal punto di vista dell&#8217;elaborazione dei feed mi sarei aspettato qualcosa di più. Va detto che in giro si trovano diversi strumenti per giocare coi feed in un sito sharepoint:</p>
<ul>
<li><a href="http://www.codeplex.com/FeedReader/">http://www.codeplex.com/FeedReader/</a> - Web part per aggrerare feed multipli, progetto ospitato su Codeplex</li>
<li><a href="http://sharepointrss.com/">http://sharepointrss.com/</a> - Una utility per generare una webpart in <em>dwp</em>, caricabile direttamente sul proprio sito sharepoint</li>
</ul>
<p> Se vogliamo però utilizzare le funzionalità standard, è possibile fare in casa con una semplice XML Web Part. Nel campo <em>XML Link</em> si riporta l&#8217;url del feed RSS, vedi figura sotto:</p>
<p><span id="more-855"></span></p>
<p><img class="size-full wp-image-856 alignnone" title="webpart" src="http://www.diplod.it/wp-content/uploads/2009/09/webpart.PNG" alt="webpart" width="243" height="414" /></p>
<p>Nell&#8217;<em>editor XSL</em>, inserire il codice seguente:</p>
<p><code>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;<br />
&lt;xsl:template match="/rss"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
 &lt;link href="xsl.css" rel="stylesheet" type="text/css" /&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
 &lt;div id="logo" style="border-bottom: 1px solid #ccc; margin-bottom: 5px; font-size: 1.2em; font-weight: bold;"&gt;<br />
  &lt;xsl:element name="a"&gt;<br />
   &lt;xsl:attribute name="href"&gt;<br />
    &lt;xsl:value-of select="channel/link" /&gt;<br />
   &lt;/xsl:attribute&gt;<br />
   &lt;xsl:value-of select="channel/title" /&gt;<br />
  &lt;/xsl:element&gt;<br />
 &lt;/div&gt;<br />
 &lt;div&gt;<br />
  &lt;ul style="list-style: none; margin: 0; padding:0"&gt;<br />
   &lt;xsl:for-each select="channel/item"&gt;<br />
     &lt;li&gt;<br />
      &lt;xsl:element name="a"&gt;<br />
       &lt;xsl:attribute name="href"&gt;<br />
        &lt;xsl:value-of select="link"/&gt;<br />
       &lt;/xsl:attribute&gt;<br />
       &lt;xsl:value-of select="title"/&gt;<br />
      &lt;/xsl:element&gt;<br />
      &lt;small style="color: #ccc; text-align: right"&gt;&lt;xsl:value-of select="pubDate" /&gt;&lt;/small&gt;<br />
     &lt;/li&gt;<br />
  &lt;/xsl:for-each&gt;<br />
  &lt;/ul&gt;<br />
 &lt;/div&gt;<br />
 &lt;div id="footer" style="display: none;"&gt;<br />
  &lt;xsl:value-of select="channel/copyright" /&gt;<br />
 &lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;</code></p>
<p>Apparirà così una web part che riporta i titoli e la data di pubblicazione degli elementi del feed. Se volessimo far apparire anche il corpo degli elementi (ad esempio il testo degli articoli di un feed), si può utilizzare il seguente codice XSL, all&#8217;interno del ciclo <em>&lt;xsl:for-each select=&#8221;channel/item&#8221;&gt;</em> :</p>
<p><code>&lt;xsl:value-of disable-output-escaping="yes" select="description" /&gt;</code></p>
<p>Se dobbiamo leggere un feed da una lista sharepoint c&#8217;è un passaggio fondamentale per far in modo che tutto funzioni: è necessario attivare l&#8217;accesso anonimo sulla lista che produce il feed. Nei <em>Settings</em> della lista, sotto a <em>Permissions and Management</em> -&gt; <em>Permissions for this list</em>, nel menu <em>Settings</em> -&gt; <em>Anonymous Access</em>, abilitare in visualizzazione l&#8217;accesso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2009/09/29/sharepoint-feed-reader-rss-con-xml-webpart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un po di XSL per processare un feed di Google News</title>
		<link>http://www.diplod.it/2008/12/18/un-po-di-xsl-per-processare-un-feed-di-google-news/</link>
		<comments>http://www.diplod.it/2008/12/18/un-po-di-xsl-per-processare-un-feed-di-google-news/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 23:06:56 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=715</guid>
		<description><![CDATA[L&#8217;obiettivo è visualizzare con una trasformazione XSL il contenuto di un feed generato da Google News per una determinata parola la chiave. Come esempio ho lanciato la ricerca di tutte le notizie riguardanti &#8220;Obama&#8221; e questo è l&#8217;url del feed prodotto: http://news.google.it/news?hl=it&#38;ned=it&#38;q=obama&#38;ie=UTF-8&#38;nolr=1&#38;output=rss Come noto, un feed RSS è un documento XML. La formattazione è classica: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>L&#8217;obiettivo è visualizzare con una trasformazione <a title="Extensible Stylesheet Language" href="http://it.wikipedia.org/wiki/Extensible_Stylesheet_Language" target="_blank">XSL</a> il contenuto di un feed generato da <a title="Google News" href="http://news.google.it" target="_blank">Google News</a> per una determinata parola la chiave. Come esempio ho lanciato la ricerca di tutte le notizie riguardanti &#8220;Obama&#8221; e questo è l&#8217;url del feed prodotto:<br />
<a title="feed google news su obama" href="http://news.google.it/news?hl=it&amp;ned=it&amp;q=obama&amp;ie=UTF-8&amp;nolr=1&amp;output=rss" target="_blank">http://news.google.it/news?hl=it&amp;ned=it&amp;q=obama&amp;ie=UTF-8&amp;nolr=1&amp;output=rss</a></p>
<p>Come noto, un feed <a title="RSS - wikipedia" href="http://it.wikipedia.org/wiki/Really_simple_syndication" target="_blank">RSS</a> è un documento <a title="XML - wikipedia" href="http://it.wikipedia.org/wiki/XML" target="_blank">XML</a>. La formattazione è classica:</p>
<blockquote><p><strong>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;rss version=&#8221;2.0&#8243;&gt;<br />
&lt;channel&gt;<br />
&lt;generator&gt;</strong>NFE/1.0<strong>&lt;/generator&gt;</strong><br />
<strong>&lt;title&gt;</strong>obama &#8211; Google News<strong>&lt;/title&gt;</strong><br />
<strong>&lt;link&gt;</strong>http://news.google.it/news?hl=it&amp;ned=it&amp;q=obama&amp;ie=UTF-8<strong>&lt;/link&gt;</strong><br />
<strong>&lt;language&gt;</strong>it<strong>&lt;/language&gt;</strong><br />
<strong>&lt;webMaster&gt;</strong>news-feedback@google.com<strong>&lt;/webMaster&gt;</strong><br />
<strong>&lt;copyright&gt;</strong>©2008 Google<strong>&lt;/copyright&gt;</strong><br />
<strong>&lt;pubDate&gt;</strong>Mon, 15 Dec 2008 14:34:32 GMT<strong>&lt;/pubDate&gt;</strong><br />
<strong>&lt;lastBuildDate&gt;</strong>Mon, 15 Dec 2008 14:34:32 GMT<strong>&lt;/lastBuildDate&gt;</strong><br />
<strong>&lt;image&gt;<br />
&lt;title&gt;</strong>obama &#8211; Google News<strong>&lt;/title&gt;</strong><br />
<strong>&lt;url&gt;</strong>http://news.google.com/intl/it_it/images/news_res.gif<strong>&lt;/url&gt;</strong><br />
<strong>&lt;link&gt;</strong>http://news.google.it/<strong>&lt;/link&gt;</strong><br />
<strong>&lt;/image&gt;<br />
&lt;item&gt;<br />
&lt;title&gt;</strong>USA: OBAMA ANNUNCIA OGGI NOMINE ENERGIA E AMBIENTE &#8211; La Repubblica<strong>&lt;/title&gt;</strong><br />
<strong>&lt;link&gt;</strong>http://news.google.it/news/url?sa=T&amp;ct=it/0-0&amp;fd=R&amp;url=http://www.repubblica.it/news/ired/ultimora/esteri/rep_esteri_n_3455881.html&amp;cid=1263615727&amp;ei=92pGScbgOJmmwAGz5pzbDg&amp;usg=AFQjCNF0go8PkbUwHKLk9BaKdp8dFCS0hg<strong>&lt;/link&gt;</strong><br />
<strong>&lt;guid isPermaLink=&#8221;false&#8221;&gt;</strong>tag:news.google.com,2005:cluster=http://www.repubblica.it/news/ired/ultimora/esteri/rep_esteri_n_3455881.html<strong>&lt;/guid&gt;</strong><br />
<strong>&lt;pubDate&gt;</strong>Mon, 15 Dec 2008 07:37:02 GMT<strong>&lt;/pubDate&gt;</strong><br />
<strong>&lt;description&gt;</strong>&lt;table border=0 width= valign=top cellpadding=2 cellspacing=7&gt;&lt;tr&gt;&lt;td width=80 align=center valign=top&gt;&lt;font style=&#8221;font-size:85%;font-family:arial,sans-serif&#8221;&gt;&lt;a  href=&#8221;http://news.google.it/news/url?sa=T&amp;ct=it/0i-0&amp;fd=R&amp;url=http://www.instablog.org/ultime/35898.html&amp;cid=1263615727&amp;ei=92pGScbgOJmmwAGz5pzbDg&amp;usg=AFQjCNFqys_EXXw7Kh4xa96o32AB49JHvw&#8221;&gt;&lt;img src=http://news.google.it/news?imgefp=ve3DuBkpQiwJ&amp;imgurl=www.instablog.org/blogpress/art/ultimora/obama.jpg width=80 height=51 alt=&#8221;&#8221; border=1&gt;&lt;br&gt;&lt;font size=-2&gt;The Instablog&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;td valign=top class=j&gt;&lt;font style=&#8221;font-size:85%;font-family:arial,sans-serif&#8221;&gt;&lt;br&gt;&lt;div style=&#8221;padding-top:0.8em;&#8221;&gt;&lt;img alt=&#8221;&#8221; height=&#8221;1&#8243; width=&#8221;1&#8243;&gt;&lt;/div&gt;&lt;div class=lh&gt;&lt;a href=&#8221;http://news.google.it/news/url?sa=T&amp;ct=it/0-0&amp;fd=R&amp;url=http://www.repubblica.it/news/ired/ultimora/esteri/rep_esteri_n_3455881.html&amp;cid=1263615727&amp;ei=92pGScbgOJmmwAGz5pzbDg&amp;usg=AFQjCNF0go8PkbUwHKLk9BaKdp8dFCS0hg&#8221;&gt;USA: &lt;b&gt;OBAMA&lt;/b&gt; ANNUNCIA OGGI NOMINE ENERGIA E AMBIENTE&lt;/a&gt;&lt;br&gt;&lt;font size=-1&gt;&lt;font color=#6f6f6f&gt;La Repubblica -&lt;/font&gt; &lt;nobr&gt;6 ore fa&lt;/nobr&gt;&lt;/font&gt;&lt;br&gt;&lt;font size=-1&gt;Il presidente eletto, Barack &lt;b&gt;Obama&lt;/b&gt;, annuncera&#8217; oggi le nomine del segretario al Dipartimento Energia e dello &#8216;zar&#8217; per l&#8217;Ambiente. Gli annunci, che verranno &lt;b&gt;&#8230;&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font size=-1&gt;&lt;a href=&#8221;http://news.google.it/news/url?sa=T&amp;ct=it/0-1&amp;fd=R&amp;url=http://notizie.alice.it/notizie/esteri/2008/12_dicembre/15/usa_obama_incontra_oggi_staff_difesa_e_annuncia_nomine_ambiente,17232675.html&amp;cid=1263615727&amp;ei=92pGScbgOJmmwAGz5pzbDg&amp;usg=AFQjCNHg4RwSRzsrR_uvMvcY3h-S38meRg&#8221;&gt;Usa/ &lt;b&gt;Obama&lt;/b&gt; incontra oggi staff difesa e annuncia nomine ambiente&lt;/a&gt; &lt;font size=-1 color=#6f6f6f&gt;&lt;nobr&gt;Virgilio Notizie&lt;/nobr&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font size=-1&gt;&lt;a href=&#8221;http://news.google.it/news/url?sa=T&amp;ct=it/0-2&amp;fd=R&amp;url=http://www.agenziami.it/ultime/9415/USA%2BObama%2Bpronte%2Ble%2Bnomine%2Bper%2Bl%2Bambiente/&amp;cid=1263615727&amp;ei=92pGScbgOJmmwAGz5pzbDg&amp;usg=AFQjCNGniMEyAO4lJg5HiWJCKROXee8p_g&#8221;&gt;USA. &lt;b&gt;Obama&lt;/b&gt;, pronte le nomine per l&#8217;ambiente&lt;/a&gt; &lt;font size=-1 color=#6f6f6f&gt;&lt;nobr&gt;(ami) Agenzia Multimediale Italiana&lt;/nobr&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font size=-1&gt;&lt;a href=&#8221;http://news.google.it/news/url?sa=T&amp;ct=it/0-3&amp;fd=R&amp;url=http://www.instablog.org/ultime/36309.html&amp;cid=1263615727&amp;ei=92pGScbgOJmmwAGz5pzbDg&amp;usg=AFQjCNF64d7ozOXQdd8tBoaRDHWfPlBfsg&#8221;&gt;&lt;b&gt;Obama&lt;/b&gt;: nomine ambiente, oggi gli annunci ufficiali&lt;/a&gt; &lt;font size=-1 color=#6f6f6f&gt;&lt;nobr&gt;The Instablog&lt;/nobr&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font class=p size=-1&gt;&lt;a class=p href=http://news.google.it/news?hl=it&amp;ned=it&amp;ie=UTF-8&amp;ncl=1263615727&gt;&lt;nobr&gt;e altri 4 articoli simili&lt;/nobr&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<strong>&lt;/description&gt;<br />
&lt;/item&gt;</strong><br />
[...]<br />
<strong>&lt;/channel&gt;<br />
&lt;/rss&gt;</strong></p></blockquote>
<p><span id="more-715"></span><br />
Si può formattare a dovere con un po&#8217; di XSL per pubblicare ad esempio i titoli, rendendoli cliccabili con un link diretto all&#8217;articolo (quello contenuto nel tag &lt;link&gt;).</p>
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243;?&gt;<br />
&lt;xsl:stylesheet version=&#8221;1.0&#8243; xmlns:xsl=&#8221;http://www.w3.org/1999/XSL/Transform&#8221;&gt;<br />
&lt;xsl:template match=&#8221;/rss&#8221;&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;!&#8211;&lt;link href=&#8221;style.css&#8221; rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; /&gt;&#8211;&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=&#8221;logo&#8221; style=&#8221;border-bottom: 1px solid #ccc; margin-bottom: 5px; font-size: 1.2em; font-weight: bold;&#8221;&gt;<br />
&lt;xsl:element name=&#8221;a&#8221;&gt;<br />
&lt;xsl:attribute name=&#8221;href&#8221;&gt;<br />
&lt;xsl:value-of select=&#8221;channel/link&#8221; /&gt;<br />
&lt;/xsl:attribute&gt;<br />
&lt;xsl:value-of select=&#8221;channel/title&#8221; /&gt;<br />
&lt;/xsl:element&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&#8221;Snippet&#8221;&gt;<br />
&lt;ul style=&#8221;list-style: none; margin: 0; padding:0&#8243;&gt;<br />
&lt;xsl:for-each select=&#8221;channel/item&#8221;&gt;<br />
&lt;li&gt;<br />
&lt;xsl:element name=&#8221;a&#8221;&gt;<br />
&lt;xsl:attribute name=&#8221;href&#8221;&gt;<br />
&lt;xsl:value-of select=&#8221;link&#8221;/&gt;<br />
&lt;/xsl:attribute&gt;<br />
&lt;xsl:value-of select=&#8221;title&#8221;/&gt;<br />
&lt;/xsl:element&gt;<br />
&lt;br/&gt;<br />
&lt;small style=&#8221;color: #ccc; text-align: right&#8221;&gt;&lt;xsl:value-of select=&#8221;pubDate&#8221; /&gt;&lt;/small&gt;<br />
&lt;/li&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/ul&gt;<br />
&lt;/div&gt;<br />
&lt;div id=&#8221;footer&#8221; style=&#8221;display: none;&#8221;&gt;<br />
&lt;xsl:value-of select=&#8221;channel/copyright&#8221; /&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;</p></blockquote>
<p>Per semplificare un po&#8217; ho aggiunto qualche regola CSS direttamente in linea, ma nulla vieta di creare un foglio esterno (ho commentato la porzione di codice che richiamerebbe un foglio di stile).<br />
L&#8217;unica vera scocciatura di Google News è che non offre un feed <em>pulito</em>, ma all&#8217;interno del tag &lt;description&gt; inserisce codice html e questo può dare problemi in fase di parsing XML.</p>
<p>Per chi volesse approfondire l&#8217;argomento un buon punto di partenza è <a title="xml - xsl" href="http://xhtml.html.it/guide/lezione/1740/trasformare-xml-introduzione-a-xsl/">questo</a>. Buona lettura.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2008/12/18/un-po-di-xsl-per-processare-un-feed-di-google-news/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
