blog.pagesd.info

Aller au contenu | Aller au menu | Aller à la recherche

Tag - Code Snippets

Fil des billets - Fil des commentaires

jeudi 28 avril 2011

Changer de fenêtre sous VS 2010

Suite au visionnage de la présentation @:The Time is Now de Phil Haack au MIX11, j'ai farfouillé dans Visual Studio 2010 et fureté un peu sur l'internet afin de découvrir comment il s'y prenait pour afficher une liste des fichiers ouverts.

Et j'ai trouvé ! Il faut faire Ctrl+Tab :

CtrlTabVs2010.png

mercredi 26 janvier 2011

Un String.Format() amélioré

Plutôt que se contenter de :

var result = string.Format("{0} messages lus sur {1}", lus, total);

On peut pomper la méthode d'extension .With() de Sutekishop :

/// <summary>
/// replacement for String.Format
/// </summary>
public static string With(this string format, params object[] args)
{
    return string.Format(format, args);
}

Et obtenir quelque chose d'un peu plus élégant :

var result = "{0} messages lus sur {1}".With(lus, total);

mercredi 1 septembre 2010

Départements limitrophes

Une fonction C# très vite faite qui renvoie la liste des départements limitrophes d'un département donné

public static string Limitrophes(string Departement) {
    string limitrophes = string.Empty;
    switch (Departement)
    {
        case "01": limitrophes = "38,39,69,71,73,74"; break;
        case "02": limitrophes = "08,51,59,60,77,80"; break;
        case "03": limitrophes = "18,23,42,58,63,71"; break;
        case "04": limitrophes = "05,06,26,83,84"; break;
        case "05": limitrophes = "04,26,38,73"; break;
        case "06": limitrophes = "04,83"; break;
        case "07": limitrophes = "26,30,38,42,43,48,84"; break;
        case "08": limitrophes = "02,51,55"; break;
        case "09": limitrophes = "11,31,66"; break;
        case "10": limitrophes = "21,51,52,77,89"; break;
        case "11": limitrophes = "09,31,34,66,81"; break;
        case "12": limitrophes = "15,30,34,46,48,81,82"; break;
        case "13": limitrophes = "30,83,84"; break;
        case "14": limitrophes = "27,50,61,76"; break;
        case "15": limitrophes = "12,19,43,46,48,63"; break;
        case "16": limitrophes = "17,24,79,86,87"; break;
        case "17": limitrophes = "16,24,33,79,85"; break;
        case "18": limitrophes = "03,36,41,45,58"; break;
        case "19": limitrophes = "15,23,24,46,63,87"; break;
        case "20": limitrophes = ""; break;
        case "2A": limitrophes = "2B"; break;
        case "2B": limitrophes = "2A"; break;
        case "21": limitrophes = "10,39,52,58,70,71,89"; break;
        case "22": limitrophes = "29,35,56"; break;
        case "23": limitrophes = "03,19,36,63,87"; break;
        case "24": limitrophes = "16,17,19,33,46,47,87"; break;
        case "25": limitrophes = "39,70,90"; break;
        case "26": limitrophes = "04,05,07,38,84"; break;
        case "27": limitrophes = "14,28,60,61,76,78,95"; break;
        case "28": limitrophes = "27,41,45,61,72,78,91"; break;
        case "29": limitrophes = "22,56"; break;
        case "30": limitrophes = "07,12,13,34,48,84"; break;
        case "31": limitrophes = "09,11,32,65,81,82"; break;
        case "32": limitrophes = "31,40,47,64,65,82"; break;
        case "33": limitrophes = "17,24,40,47"; break;
        case "34": limitrophes = "11,12,30,81"; break;
        case "35": limitrophes = "22,44,49,50,53,56"; break;
        case "36": limitrophes = "03,18,23,37,41,86,87"; break;
        case "37": limitrophes = "36,41,49,72,86"; break;
        case "38": limitrophes = "01,05,07,26,42,69,73"; break;
        case "39": limitrophes = "01,21,25,70,71"; break;
        case "40": limitrophes = "32,33,47,64"; break;
        case "41": limitrophes = "18,28,36,37,45,72"; break;
        case "42": limitrophes = "03,07,38,43,63,69,71"; break;
        case "43": limitrophes = "07,15,42,48,63"; break;
        case "44": limitrophes = "35,49,56,85"; break;
        case "45": limitrophes = "18,28,41,58,77,89,91"; break;
        case "46": limitrophes = "12,15,19,24,47,82"; break;
        case "47": limitrophes = "24,32,33,40,46,82"; break;
        case "48": limitrophes = "07,12,15,30,43"; break;
        case "49": limitrophes = "35,37,44,53,72,79,85,86"; break;
        case "50": limitrophes = "14,35,53,61"; break;
        case "51": limitrophes = "02,08,10,52,55,77"; break;
        case "52": limitrophes = "10,21,51,55,70,88"; break;
        case "53": limitrophes = "35,49,50,61,72"; break;
        case "54": limitrophes = "55,57,88"; break;
        case "55": limitrophes = "08,51,52,54,88"; break;
        case "56": limitrophes = "22,29,35,44"; break;
        case "57": limitrophes = "54,67"; break;
        case "58": limitrophes = "03,18,21,45,71,89"; break;
        case "59": limitrophes = "02,80,62"; break;
        case "60": limitrophes = "02,27,76,77,80,95"; break;
        case "61": limitrophes = "14,27,28,50,53,72"; break;
        case "62": limitrophes = "59,80"; break;
        case "63": limitrophes = "03,15,19,23,42,43"; break;
        case "64": limitrophes = "32,40,65"; break;
        case "65": limitrophes = "31,32,64"; break;
        case "66": limitrophes = "09,11"; break;
        case "67": limitrophes = "57,68,88"; break;
        case "68": limitrophes = "67,88,90"; break;
        case "69": limitrophes = "01,38,42,71"; break;
        case "70": limitrophes = "21,25,52,88,90"; break;
        case "71": limitrophes = "01,03,21,39,42,58,69"; break;
        case "72": limitrophes = "28,37,41,49,53,61"; break;
        case "73": limitrophes = "01,05,38,74"; break;
        case "74": limitrophes = "01,73"; break;
        case "75": limitrophes = "92,93,94"; break;
        case "76": limitrophes = "14,27,60,80"; break;
        case "77": limitrophes = "02,10,45,51,60,89,91,93,94,95"; break;
        case "78": limitrophes = "27,28,91,92,95"; break;
        case "79": limitrophes = "16,17,49,85,86"; break;
        case "80": limitrophes = "02,60,62,76"; break;
        case "81": limitrophes = "11,12,31,34,82"; break;
        case "82": limitrophes = "12,31,32,46,47,81"; break;
        case "83": limitrophes = "04,06,13,84"; break;
        case "84": limitrophes = "04,07,13,26,30,83"; break;
        case "85": limitrophes = "17,44,49,79"; break;
        case "86": limitrophes = "16,27,36,49,79,87"; break;
        case "87": limitrophes = "16,19,23,24,36,86"; break;
        case "88": limitrophes = "52,54,55,67,68,70"; break;
        case "89": limitrophes = "10,21,45,58,77"; break;
        case "90": limitrophes = "25,68,70"; break;
        case "91": limitrophes = "28,45,77,78,92,94"; break;
        case "92": limitrophes = "75,78,91,95,94"; break;
        case "93": limitrophes = "75,77,92,94,95"; break;
        case "94": limitrophes = "75,77,91,92,93"; break;
        case "95": limitrophes = "27,60,77,78,92,93"; break;
    }
    return limitrophes;
}

En vrai, tout le boulot ingrat pour retrouver les bons départements avait été fait par Sunfox.

jeudi 10 septembre 2009

Placer un libellé semi-transparent sur une image

J'avais vu ça il y a pas mal de temps, alors ce coup-ci je blogue pour essayer de ne pas oublier comment faire.

Côté Html

<div class="img-desc">
        <img src="sample.jpg" alt="" />
        <cite>Salone del mobile Milano, April 2008 - Peeta</cite>
</div>

Côté CSS

.img-desc {
        position: relative;
        display: block;
        height:335px;
        width: 575px;
}
.img-desc cite {
        background: #111;
        filter:alpha(opacity=55);
        opacity:.55;
        color: #fff;
        position: absolute;
        bottom: 0;
        left: 0;
        width: 555px;
        padding: 10px;
        border-top: 1px solid #999;
}

Sources et exemples

vendredi 19 juin 2009

Une fonction XSLT avec des paramètres

Jusque là, je connaissais déjà les "templates" qui me permettaient grosso-modo de structurer mes traitements XSLT en séparant en quelque sorte le "layout" de la page des traitements pour afficher les différents contenus :

<!-- Disposition générale du document -->
...
<fo:table-row height="27mm" margin-top="15mm">
        <fo:table-cell>
                <!-- Logo client -->
                <xsl:call-template name="client-logo" />
        </fo:table-cell>
        <fo:table-cell>
                <!-- Adresse client -->
                <xsl:call-template name="client-adresse" />
        </fo:table-cell>
</fo:table-row>
...
<!-- Affichage du logo du client -->
<xsl:template name="client-logo">
        <fo:block>
                <fo:external-graphic src="url('logo_client.jpg')" />
        </fo:block>
</xsl:template>

<!-- Affichage de l'adresse du client -->
<xsl:template name="client-adresse">
        <fo:block>
                <xsl:value-of select="a:OrganizationName" />
        </fo:block>
        <xsl:for-each select="a:PostalAddress/a:DeliveryAddress/a:AddressLine">
                <fo:block>
                        <xsl:value-of select="." />
                </fo:block>
        </xsl:for-each>   
        <fo:block>
                <xsl:value-of select="a:PostalAddress/a:PostalCode" />
                &#32;<xsl:value-of select="a:PostalAddress/a:Municipality" />
        </fo:block>
</xsl:template>

Et hier soir, j'ai appris un nouveau truc. Comme j'avais besoin d'afficher plusieurs fois des dates, je me suis retrouvé à faire du copier / coller du morceau de code suivant :

<fo:block>
        <xsl:value-of select="concat(substring(a:DocumentInfo/a:DateRange/a:StartDate, 9, 2), 
                                '/', substring(a:DocumentInfo/a:DateRange/a:StartDate, 6, 2),
                                '/', substring(a:DocumentInfo/a:DateRange/a:StartDate, 1, 4))" />
</fo:block>

Puis à chaque fois je devais remplacer "a:DocumentInfo/a:DateRange/a:StartDate" par "a:DocumentInfo/a:DateRange/a:EndDate" ou "a:DocumentInfo/a:PartialRange/a:ActualDate" ... Non seulement ce n'était pas très intéressant à faire, mais c'était surtout la porte ouverte à toutes les erreurs de frappe ou de copier / coller.

Heureusement pour moi, comme XSLT est quand même bien conçu, il est aussi possible de définir des templates avec des variables paramètres :

<xsl:template name="format-date">
        <xsl:param name="d" select="0" />
        <xsl:value-of select="concat(substring($d, 9, 2), '/', substring($d, 6, 2), '/', substring($d, 1, 4))" />
</xsl:template>

Ensuite, on peut appeler cette "fonction" XSLT en lui passant le paramètre de notre choix :

<xsl:call-template name="format-date">
        <xsl:with-param name="d" select="a:DocumentInfo/a:DateRange/a:StartDate" />
</xsl:call-template>

C'est vrai que ça ne fait pas économiser beaucoup de saisie, mais c'est quand même un peu plus clair et beaucoup moins risqué.

D'autres exemples sur l'article Programmer avec XSLT de Victor Stinner.

mardi 28 avril 2009

Pinguer une Url

Il est quelquefois très pratique de pouvoir exécuter un traitement sur un site web. Par exemple, dans PI il existe une page pour sauvegarder automatiquement la base de données. Le problème, c'est que sous Windows, il n'est pas possible de faire une tache planifiée qui appelle directement une page web.

J'avais écrit il y a quelques temps un petit utilitaire UrlPing pour faire une requête sur une page web en indiquant simplement l'url à atteindre. Tout marchait plutôt bien depuis plus d'un an jusqu'à ce qu'hier j'essaie de l'utiliser avec une url qui ne correspond pas à un "vrai" fichier .aspx mais à une url "rewritée". Et là, cela provoque une erreur du type "Tentatives de redirection automatique trop nombreuses".

J'en ai donc profité pour améliorer le code et le publier si jamais cela intéresse quelqu'un.

namespace Altrr.Tools.UrlPing {

  using System;
  using System.Net;

  class Start {

    [STAThread]
    static void Main(string[] args) {

      if (args.Length == 1) {
        string url = args[0];
        Console.Write(url + " : ");
        try {
          HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
          request.CookieContainer = new CookieContainer();
          request.Method = "HEAD";
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          Console.WriteLine("OK (" + Convert.ToInt32(response.StatusCode) + " - " + response.StatusDescription + ")");
          string urlr = response.ResponseUri.ToString();
          if (url != urlr) {
            Console.WriteLine("-------\n" + urlr);
          }
        } catch (Exception ex) {
          Console.WriteLine("KO\n-------\n" + ex.Message);
        }
      } else {
        Console.WriteLine("Syntax : UrlPing url");
      }

    }

  }
}

mardi 21 avril 2009

System.Net.Mail et smtp.gmail.com

Poursuivant mes essais de migration d'Altrr-Press vers ASP.NET 2.0, j'ai enfin étudié comment remplacer System.Web.Mail par System.Net.Mail. Jusqu'à présent, j'utilisais la méthode décrite dans mon plus célèbre billet System.Web.Mail and smtp.gmail.com.

Par rapport à cette méthode, les modifications à apporter n'ont finalement pas été si compliquées que ça :

public string sendMail (string from, string to, string cc, string bcc, string subject, string body) {

  // Mail initialization
  MailMessage mail = new MailMessage();
  mail.From = new MailAddress(from);
  mail.To.Add(to);
  if (cc != "") {
    mail.Cc.Add(new MailAddress(cc));
  }
  if (bcc != "") {
    mail.Bcc.Add(new MailAddress(bcc));
  }
  mail.Subject = subject;
  mail.IsBodyHtml = false;
  mail.BodyEncoding = System.Text.Encoding.UTF8;
  mail.Body = body;

  // Smtp configuration
  SmtpClient smtp = new SmtpClient();
  smtp.Host = "smtp.gmail.com";
  // - smtp.gmail.com use smtp authentication
  smtp.Credentials = new NetworkCredential("myemail@gmail.com", "mypassword");
  // - smtp.gmail.com with System.Net.Mail accepts port 25 or 587
  smtp.Port = 25;
  // - smtp.gmail.com use STARTTLS (some clients call this SSL)
  smtp.EnableSsl = true;

  // Mail sending
  try {
    smtp.Send(mail);
    return "";
  } catch (Exception ex) {
    return ex.Message;
  }
}

Une première petite difficulté est venu des propriétés From, To, Cc et Bcc de l'objet MailMessage qui ne sont plus de type chaine comme en .NET 1 mais du type MailAddress ou collection de MailAddress.

Mais le plus gros problème, c'est qu'avec System.Net.Mail, je n'ai jamais réussi à utiliser le port 465 alors qu'il fonctionne très bien avec System.Web.Mail (et même sur un site en .NET 2 qui utilise encore System.Web.Mail !!!). Et comme en local le port 587 n'est pas ouvert, j'ai un peu trainé pour faire mes tests puisque je devais à chaque fois faire une mise en production afin de vérifier si cela fonctionnait.

Mais au final, j'ai quand même découvert qu'avec System.Net.Mail :

  • cela fonctionne aussi bien avec le port 587 qu'avec le port 25 (!)
  • il n'est même pas nécessaire de définir la propriété smtp.Port pour que le mail parte (re !)

vendredi 17 octobre 2008

Utilier des dates dans les fichiers BAT

Pour commencer, le truc de base :

ECHO %Date%
17/10/2008
ECHO %Time%
 9:58:13,70

Mais on peut faire mieux en utilisant la syntaxe %Date:~x,y% ou %Time:~x,y%, où :

  • x représente la position du 1° caractère dans la date ou l'heure en cours
  • y correspond au nombre de caractères à extraire

La longueur d'une date étant de 10 caractères, x peut prendre une valeur allant de 0 à 9. Par contre, si la valeur de y est supérieure au nombre de caractères présents à partir de la position x, cela n'a pas d'importance : cela ne renverra que le nombre de caractères disponibles.

Donc pour avoir une date au format YYYY-MM-DD, il faut utiliser la syntaxe suivante :

ECHO %Date:~6,4%-%Date:~3,2%-%Date:~0,2%
2008-10-17

On peut aussi utiliser une valeur négative pour x pour compter les caractères de la droite vers la gauche. Dans ce cas, la valeur de x peut aller de -1 à -10 (-1 étant le dernier caractère de la date, -2 l'avant-dernier...). En utilisant une valeur négative, on obtiendra une date au format YYYY-MM-DD avec la syntaxe suivante :

ECHO %Date:~-4,4%-%Date:~-7,2%-%Date:~-10,2%
2008-10-17

Et c'est pareil pour les heures : il faut utiliser la syntaxe suivante pour obtenir une heure au format HH-MM-SS :

ECHO %Time:~0,2%-%Time:~3,2%-%Time:~6,2%
10-03-44

mercredi 17 septembre 2008

Tableau d'ArrayList

Pour créer un tableau de 2 ArrayList, il ne suffit pas d'écrire :

ArrayList[] list = new ArrayList[2];

Cela ne fait que déclarer un tableau de 2 ArrayList mais qui sont nulls. Il faut aussi initialiser chacune des ArrayList en procédant de la façon suivante :

ArrayList[] list = new ArrayList[2] { new ArrayList(), new ArrayList() };

C'est pas plus compliqué que ça :)

Et dans le cas où on aurait besoin d'un peu plus que 2 ArrayList, il vaut mieux passer par une boucle :

ArrayList[] list = new ArrayList[2];
for (int i = 0; i < list.Length; i++) {
    list[i] = new ArrayList();
}

jeudi 17 juillet 2008

Vérifier la version du .NET installée

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        lblVersion.Text = System.Environment.Version.ToString();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>ASP.NET Version Checker</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>     
        <p>.NET CLR Version: 
        <strong><asp:Label ID="lblVersion" runat="server" /></strong></p>
    </div>
    </form>
</body>
</html>

mercredi 11 juillet 2007

Faire un Join sur un ArrayList

string texts = string.Join(",", (string[]) myArrayList.ToArray(typeof(string)));;

mercredi 30 mai 2007

Mise à jour d'une table à partir d'une autre

Pour mettre à jour un champ d'une table à partir du champ équivalent d'une autre table, Access accepte deux noms de tables pour la commande UPDATE, mais pas Sql Server.

Exemple : les taux de TVA ayant été corrigés dans la table des articles, il faut répercuter ces modifications dans la table des lignes de factures

Sous Access

UPDATE LignesFactures, Articles
SET    LignesFactures.TauxTva = Articles.TauxTva
WHERE  LignesFactures.ArticleID = Articles.ArticleID

Sous Sql Server

UPDATE LignesFactures
SET    LignesFactures.TauxTva = Articles.TauxTva
FROM   LignesFactures
INNER JOIN Articles ON Articles.ArticleID = LignesFactures.ArticleID

Mise à jour : Sous Oracle

UPDATE LignesFactures
SET    LignesFactures.TauxTva = (SELECT Articles.TauxTva
                                 FROM   Articles
                                 WHERE  Articles.ArticleID = LignesFactures.ArticleID)

mercredi 13 décembre 2006

Compacter une base de données Microsoft Access à l'aide de C#

Adaptation de la KB306287 :

  1. Ouverture d'une nouvelle application de console C#.
  2. Dans la fenêtre Explorateur de solutions, cliquez avec le bouton droit sur le nœud Références, puis sélectionnez Ajouter une référence.
  3. Dans la boîte de dialogue Ajouter une référence, cliquez sur l'onglet COM, puis sélectionnez Microsoft Jet and Replication Objects 2.6 Library. Cliquez sur Sélectionner pour l'ajouter à la liste Composants sélectionnés. Cliquez sur OK.
  4. Un avertissement s'affiche si aucun wrapper ne figure dans la bibliothèque sélectionnée. Cliquez sur Oui pour générer un wrapper. La bibliothèque Microsoft ActiveX Data Objects (ADODB) et les références JRO s'ajoutent aux références du projet.
  5. Dans la fenêtre de l'Explorateur de solutions, cliquez avec le bouton droit sur Class1.cs, puis cliquez sur Afficher le code.
  6. Supprimez tout le code de la fenêtre.
  7. Copiez le code suivant et collez-le dans la fenêtre de code :
    using System;
    using System.IO;
    
    namespace CompactMDB {
      class Class1 {
        [STAThread]
        static void Main(string[] args) {
          // http://support.microsoft.com/kb/306287/
          if (args.Length != 1) {
            Console.WriteLine(@"CompactMDB D:\path\database.mdb");
          } else {
            string dbName = args[0].Trim();
            string dbTemp = dbName + "_pak";
            string provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
            try {
              JRO.JetEngine jet = new JRO.JetEngine();
              jet.CompactDatabase(provider + dbName, provider + dbTemp);
            } catch (Exception ex) {
              Console.WriteLine(ex.Message);
              dbName = "";
            }
            if (dbName != "") {
              try {
                FileInfo fi = new FileInfo(dbName);
                string result = dbName + " : " + fi.Length.ToString();
                File.Delete(dbName);
                File.Move(dbTemp, dbName);
                fi.Refresh();
                result += " -> " + fi.Length.ToString();
                Console.WriteLine(result);
              } catch (Exception ex) {
                Console.WriteLine(ex.Message);
              }
            }
          }
        }
      }
    }
    
  8. Régénérez la solution.

Le programme s'exécute ensuite à partir d'une Invite de commande, en tapant : CompactMDB D:\path\database.mdb.

mercredi 19 avril 2006

VS2003 - Echec de l'actualisation du projet

Après avoir fermé toutes les session de Visual Studio, passer dans l'explorateur de fichier et aller dans le sous-répertoire :

  • - Documents and Settings
  • - - "userlogin" (login de l’utilisateur)
  • - - - VSWebCache
  • - - - - "hostname" (nom de la machine)

Et supprimer le cache du projet qui pose problème (ou éventuellement de tous les projets).

(publié à l’origine sur http://www.bigbold.com/snippets/posts/show/1937)

jeudi 2 mars 2006

Throwing from XSLT

Vu sur http://weblogs.asp.net/george_v_reilly/archive/2006/03/01/439402.aspx

I (George V. Reilly, not me) needed to add some declarative error checking to some XSLT templates recently. Specifically, I wanted to throw an error if my selects yielded an empty string, indicating that the input XML was wrong.

Unfortunately, there seems to be no easy way of doing this in XSLT, nor in XslTransform. The approved way is to validate against an XSD schema, but for various reasons, I didn't want to go to the hassle of creating one.

I found a partial solution using xsl:message with the terminate="yes" attribute. Under XslTransform.Transform() the following code throws an exception if the XPath expression is empty.

<xsl:if test="not(/some/xpath/expression)">
     <xsl:message terminate="yes">Missing expression</xsl:message>
</xsl:if>
<xsl:value-of select="/some/xpath/expression" />

It doesn't do anything, however, in XMLSpy.

The downside, of course, is that you have to maintain the expression in two places, and the template becomes littered with those annoying tests.

(publié à l’origine sur http://www.bigbold.com/snippets/pos...)

mardi 24 janvier 2006

HTTP 301 - Moved Permanently

<script runat="server">
private void Page_Load(object sender, System.EventArgs e) {
  Response.Status = "301 Moved Permanently";
  Response.AddHeader("Location", "http://www.new-url.com");
}
</script>

(publié à l'origine sur http://www.bigbold.com/snippets/posts/show/1295)

jeudi 19 janvier 2006

Blogmarks to Html conversion

Ce fichier permet de transformer le fil atom de Blogmarks (par exemple http://api.blogmarks.net/user/ms_michel) en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
        xmlns:atom="http://www.w3.org/2005/Atom" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:dc="http://purl.org/dc/elements/1.1/">
  <xsl:output method="html" />
  <xsl:template match="/">
    <xsl:apply-templates select="/atom:feed/atom:head" mode="before" />
    <xsl:apply-templates select="/atom:feed/atom:entry" />
    <xsl:apply-templates select="/atom:feed/atom:head" mode="after" />
  </xsl:template>
  <xsl:template match="atom:feed/atom:head" mode="before" >
    <!-- <h3><xsl:value-of select="atom:title" /></h3> -->
  </xsl:template>
  <xsl:template match="atom:feed/atom:head" mode="after">
    <p><a href="{atom:link[@rel='alternate']/@href}"><img src="http://blogmarks.net/img/88x31_neg.png" alt="blogmarks.net" /></a></p>
  </xsl:template>
  <xsl:template match="atom:feed/atom:entry">
    <div>
      <xsl:choose>
        <xsl:when test="position() mod 2 = 1">
          <xsl:attribute name="class">bm_blogmarks bm_odd</xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
          <xsl:attribute name="class">bm_blogmarks bm_even</xsl:attribute>
        </xsl:otherwise>
      </xsl:choose>
      <a href="{atom:link[@rel='related']/@href}"><img src="{atom:link[@rel='image']/@href}" alt="" /></a>
      <h4><a href="{atom:link[@rel='related']/@href}"><xsl:value-of select="atom:title" /></a></h4>
      <p><xsl:value-of select="atom:summary" disable-output-escaping="yes" /></p>
      <p class="blogmarks-tags">
        <xsl:value-of select="substring(atom:published, 0, 11)" />
        <xsl:if test="atom:category">
          <xsl:for-each select="atom:category">
            <xsl:text> - </xsl:text><a href="{@term}{@sheme}"><xsl:value-of select="@label" /></a>
          </xsl:for-each>
        </xsl:if>
      </p>
    </div>
  </xsl:template>
</xsl:stylesheet>

Le code html généré est inspiré par celui de Hot Links. Il peut ensuite être présenté grâce à la feuille de style CSS suivante :

.bm_blogmarks {
  margin: 10px auto;
  padding: 1%;
  background-color: #f5f5f5;
  border: 1px solid #d9d9d9;
  width: 97%;
  overflow:auto;
}
.bm_even {
  background-color: #fcfcfc;
}
.bm_blogmarks h4 {
  margin-top: 0;
}
.bm_blogmarks p.bm_tags {
  margin-bottom: 0;
  display: block;
  clear: left;
}
.bm_blogmarks img {
  margin: 0 0px 5px 10px;
  float: right;
  border: 0;
  clear: none;
  width: 144px;
  height: 107px;
}
.bm_even img {
  margin: 0 10px 5px 0px;
  float: left;
}

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

lundi 16 janvier 2006

RDF to Html conversion

Ce fichier permet de transformer un fil RDF en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:foo="http://purl.org/rss/1.0/">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/rdf:RDF/foo:channel"/>
    </xsl:template>
    <xsl:template match="/rdf:RDF/foo:channel">
        <h3><xsl:value-of select="foo:title"/></h3>
        <p><xsl:value-of select="foo:description"/></p>
        <ul>
            <xsl:apply-templates select="/rdf:RDF/foo:item"/>
        </ul>
    </xsl:template>
    <xsl:template match="/rdf:RDF/foo:item">
        <li>
            <a href="{foo:link}" title="{substring(dc:date, 0, 11)}"><xsl:value-of select="foo:title"/></a>
            <p><xsl:value-of select="foo:description" disable-output-escaping="yes" /></p>
        </li>
    </xsl:template>
</xsl:stylesheet>

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

RSS to Html conversion

Ce fichier permet de transformer un fil RSS (version 0.9x ou 2.0) en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/rss/channel"/>
    </xsl:template>
    <xsl:template match="/rss/channel">
        <h3><xsl:value-of select="title"/></h3>
        <p><xsl:value-of select="description"/></p>
        <ul>
            <xsl:apply-templates select="item"/>
        </ul>
    </xsl:template>
    <xsl:template match="/rss/channel/item">
        <li>
            <a href="{link}" title="{substring(pubDate, 0, 11)}"><xsl:value-of select="title"/></a>
            <p><xsl:value-of select="description" disable-output-escaping="yes" /></p>
        </li>
    </xsl:template>
</xsl:stylesheet>

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

Atom to Html conversion

Ce fichier permet de transformer un fil atom en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
    <xsl:output method="html"/>
    <xsl:template match="/">
    <xsl:apply-templates select="/atom:feed/atom:head"/>
        <xsl:apply-templates select="/atom:feed"/>
    </xsl:template>
    <xsl:template match="atom:feed/atom:head">
        <h3><xsl:value-of select="atom:title"/></h3>
        <xsl:if test="atom:tagline"><p><xsl:value-of select="atom:tagline"/></p></xsl:if>
        <xsl:if test="atom:subtitle"><p><xsl:value-of select="atom:subtitle"/></p></xsl:if>
    </xsl:template>
    <xsl:template match="/atom:feed">
        <h3><xsl:value-of select="atom:title"/></h3>
        <xsl:if test="atom:tagline"><p><xsl:value-of select="atom:tagline"/></p></xsl:if>
        <xsl:if test="atom:subtitle"><p><xsl:value-of select="atom:subtitle"/></p></xsl:if>
        <ul>
            <xsl:apply-templates select="atom:entry"/>
        </ul>
    </xsl:template>
    <xsl:template match="atom:entry">
        <li>
            <a href="{atom:link[@rel='related']/@href}" title="{substring(atom:published, 0, 11)}"><xsl:value-of select="atom:title"/></a>
            <xsl:choose>
                <xsl:when test="atom:content != ''">
                    <p><xsl:value-of select="atom:content" disable-output-escaping="yes" /></p>
                </xsl:when>
                <xsl:otherwise>
                    <p><xsl:value-of select="atom:summary" disable-output-escaping="yes" /></p>
                </xsl:otherwise>
            </xsl:choose>
        </li>
    </xsl:template>
</xsl:stylesheet>

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

- page 1 de 3