Bonjour,

Desole pour ce titre generique, mais je prefere plutot mettre en avant mon probleme plutot que la solution a laquelle je pense.

Je cherche a generer un document a partir d'un template. Le template serait idealement un document qui est lui-meme "bien forme", i.e. on peut voir le visualiser meme avant processing. Le template serait de la famille html/xhtml/xml; ce serait un template parce qu'il comporterait des balises qui en soit ne signifient rien mais qui auraient vocation a etre remplacees par du contenu provenant d'un fichier xml separe.

Par exemple, le template pourrait etre du genre:

<html>
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css"/>
</head>
<body>
<p>My name is <name/></p>
</body>
</html>


et le fichier xml

<myself>
<name>Toto</name>
</myself>


et l'idee serait d'afficher un document avec "My name is Toto" avec le style "mystyle.css". J'aimerais savoir si ca serait possible de faire ca en utilisant xslt, ou un autre technique de la famille (c'est a dire, sans passer par genre un script perl qui parserait le template et ferait le remplacement "a la main").

Merci pour vos conseils

Pierre
Merci pour ta reponse. Je dois preciser que je connais quand meme un peu XSLT (bien que pas suffisamment pour resoudre mon probleme).

Pour faire simple, mon probleme est de separer le template du XSLT. Le XSLT "a la papa" resoudrait mon probleme de la facon suivante:


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> 
<head> 
<link rel="stylesheet" type="text/css" href="mystyle.css"/> 
</head> 
<body> 
<p>My name is <xsl:value-of select="myself/name"/></p> 
</body> 
</html>
</xsl:template>


et en prenant soin de rajouter la ligne


<?xml-stylesheet type="text/xsl" href="mytemplate.xsl"?>


au fichier xml.

Ce qui n'est pas satisfaisant, c'est l'imbrication du template dans le fichier XSLT. J'aimerais avoir un template distinct (en xml ou xhtml) et idealement bien forme.
Une autre solution consiste à utiliser PHP, plus particulièrement l'extension SimpleXML.
<?php
// Chargement du fichier XML
$xml = simplexml_load_file ('nom-du-fichier.xml');

// On récupère le contenu de l'élément name (on suppose que myself est l'élément racine)
$name = $xml -> name[0];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head>
<title>Document title</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<link rel="stylesheet" type="text/css" href="mystyle.css" /> 
</head> 
<body> 
<p>My name is <?php echo $name; ?></p> 
</body> 
</html>
Tout a fait exact. Cependant, a mon sens, ca ne resoud pas mon probleme puisque ce code est completement dans la ligne du code XSLT que j'ai donne: pas de separation entre le template et le code.

Par ailleurs, j'aurais du preciser que la mise en forme du document doit se faire chez le client, de manière passive, i.e. pas d'utilisation d'un serveur (php ou autre), et si possible pas de javascipt. Je suis quasi certain qu'on peut s'en sortir avec XML et XSLT seulement mais comment, mystere...
haar a écrit :
Par ailleurs, j'aurais du preciser que la mise en forme du document doit se faire chez le client, de manière passive, i.e. pas d'utilisation d'un serveur (php ou autre), et si possible pas de javascipt. Je suis quasi certain qu'on peut s'en sortir avec XML et XSLT seulement mais comment, mystere...

Sans JavaScript ou sans langage côté serveur, cela relève de la mission impossible. Smiley rolleyes
Je ne pense pas. XML+XSLT marche cote client avec n'importe quel navigateur digne de ce nom.
Bonjour,

Côté serveur, c'est relativement facile.

Je pense qu'une solution serait d'appliquer la transformation non au document "source" qui contient les données, mais au template lui-même. À chaque fois que ton parseur XSLT trouve un élément à remplacer (comme name), tu peux alors appeler un... template XSLT (xsl:template), qui cherchera l'information correspondante dans le fichier contenant tes données à l'aide de la fonction document() de XPath.

Pour éviter les multiples saisies du chemin, il suffit de créer une variable "globale" XSLT contenant le chemin vers ce fichier (par exemple <xsl:variable name="chemin" value="../../sources/info.xml" />). Bien sûr, cela signifie qu'à chaque transformation d'un fichier différent, tu es obligé d'éditer ta feuille XSLT pour mettre à jour le chemin, mais comme un fichier XSLT est un bête fichier texte, tu peux la générer directement en PHP par exemple... Cela donne au final le scénario suivant:
1. le navigateur demande le fichier toto.xml
2. le serveur lui sert le fichier template.xml, mis en forme à l'aide de la feuille de style generic.xsl générée dynamiquement

Cela ne me semble pas insurmontable en termes de paramétrages...

Côté client, il suffit d'inclure dans ta feuille de style une autre feuille de style contenant les briques de ton document final (ici par exemple, ce qui est dans ton template avant le <name />, sous la forme d'éléments template nommés -<xsl:template name="...">(...)</xsl:template>), puis, lorsque tu transformes ton document XML, d'appeler ces templates lorsque tu appliques la transformation.

Mais je pense que tu te compliques la vie, en cherchant une solution qui te paraît peut-être plus élégante, mais va à l'encontre de la "philosophie" même de XSLT. Une feuille de style XSLT, en effet, c'est un template, et rien de plus (les possibilités de mise en forme et de calculs sont essentiellement accessoires), qui a pour unique but de transformer un document XML donné en quelque chose d'autre. Quand tu appliques une feuille de style à un document XML, tu ne fais qu'appliquer un template à ce document. C'est techniquement possible, mais au fond alors tu demandes à ta feuille de style non pas d'appliquer un template à ton document, ce qu'elle est conçue pour faire, mais d'appeler des templates définis dans une autre feuille de style pour les appliquer au document.