2010-01-11 9 views
1

quelqu'un peut-il me lancer en ce qui concerne la conversion de XML en HTML. J'ai déjà travaillé sur des conversions XSLT, mais jamais à partir de rien, et il me semble qu'il me manque quelque chose.Aide à démarrer avec XML -> HTML via XSLT

A partir de XML qui est quelque chose comme ceci:

<order name="fred" value="123.45"> 
    <lines> 
    <line description="foo" value="123"/> 
    <line description="bar" value="0.45"/> 
    </lines> 
</order> 

... et un fichier XSLT qui ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:decimal-format name="sterling" decimal-separator="." grouping-separator=","/> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
    <html> 
     <head> 
     <xsl:apply-templates select="order"/> 
     </head> 
     <body> 
     <table border="2"> 
      <xsl:apply-templates select="order/lines/line"/> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="order"> 
    Name is '<xsl:value-of select="@name"/>' and value is <xsl:value-of select="format-number(@value, '£#,###.00', 'sterling')"/> 
    </xsl:template> 

    <xsl:template match="order/lines/line"> 
    <tr> 
     <td> 
     <xsl:value-of select="@description"/> 
     </td> 
     <td> 
     <xsl:value-of select="@value"/> 
     </td> 
    </tr> 
    </xsl:template> 

</xsl:stylesheet> 

Quand je fais la conversion à l'aide d'un objet XslCompiledTransform de C#, Je reçois le HTML de base mais pas de contenu pour les lignes. Le code que j'ai utilisé pour la transformation est comme suit:

private static String GetHtml(String xml) 
{ 
    String result; 

    var doc = new XmlDocument(); 
    doc.LoadXml(xml); 

    var transformer = new XslCompiledTransform(true); 
    transformer.Load("foobar.xslt"); 

    using (var writer = new StringWriter()) 
    { 
     transformer.Transform(doc, null, writer); 
     result = writer.ToString(); 
    } 

    return result; 
} 

Toute aide grandement appréciée.

Ross

(en aparté, quel est le point de l'élément xsl: format décimal si, en utilisant la fonction format-nombre, je dois fournir la chaîne de format?)

Répondre

1

ce ne sera jamais utilisé, car il n'y a pas attribute ou element nommé fred:

<xsl:template match="fred"> 

Vous devez quelque chose comme:

<xsl:template match="@name"> 

Et De même, la section apply-templates appelant cet attribut doit changer pour:

<xsl:apply-templates select="@name"/> 

Sur la base de la structure du XML que vous avez publié, vous devez changer toute mention de fred à order dans votre XSLT .

+0

Merci d'avoir signalé cela. Trop de hâte de ma part sinon j'aurais posté le bon fichier xslt. J'ai corrigé le post original qui fonctionne maintenant pour les détails principaux de 'commande' mais pas les lignes. Merci, Ross –

1

Le contenu que vous semblez vouloir afficher dans le fichier HTML HEAD ne semble pas valide.

Oded est correct, vous n'avez aucun élément fred dans votre document source, seulement un attribut prenant la valeur fred.

Aussi l'un de vos modèles mentionne Requisition qui n'est pas non plus présent dans votre source XML.

<xsl:template match="/"> 
    <html> 
    <head> 
     <title><xsl:apply-templates select="order"/></title> 
    </head> 
    <body> 
     <table border="2"> 
     <xsl:apply-templates select="order/lines/line"/> 
     </table> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="order"> 
    Name is '<xsl:value-of select="@name"/>' and value is <xsl:value-of select="format-number(@value, '£#,###.00', 'sterling')"/> 
</xsl:template> 

<xsl:template match="line"> 
    <tr> 
    <td> 
     <xsl:value-of select="@description"/> 
    </td> 
    <td> 
     <xsl:value-of select="@value"/> 
    </td> 
    </tr> 
</xsl:template> 

Codée à sec, ymmv.

+0

Salut, merci de le signaler. J'essayais de créer une petite application de test à partir d'une application beaucoup plus grande, et je n'ai pas changé les noms de nœuds/attributs correctement. Maintenant, au moins, j'ai une application de mini test de travail - maintenant je dois savoir pourquoi mon application principale ne fonctionne pas. Une des grandes choses sur les forums comme StackOverflow, c'est que vos propres erreurs vous deviennent évidentes dès que vous appuyez sur "Post". Encore merci beaucoup. Ross –