帮助开始使用XML - > HTML通过XSLT

时间:2010-01-11 15:44:17

标签: html xml xslt

任何人都可以将我的一些XML转换为HTML。我以前从事过XSLT转换,但从不从头开始,我似乎错过了一些东西。

从XML开始,就像这样:

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

...和一个如下所示的XSLT文件:

<?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>

当我使用C#中的XslCompiledTransform对象进行转换时,我获得了基本的html但没有内容。我用于转换的代码如下:

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;
}

非常感谢任何帮助。

罗斯

(顺便说一下,如果在使用format-number函数时,我必须提供格式字符串,那么xsl:decimal-format元素的意义是什么?)

2 个答案:

答案 0 :(得分:1)

这绝不会被使用,因为没有名为attribute的{​​{1}}或element

fred

您需要以下内容:

<xsl:template match="fred">

同样,调用此属性的<xsl:template match="@name"> 部分需要更改为:

apply-templates

根据您发布的XML结构,您需要在XSLT中将每次提及<xsl:apply-templates select="@name"/> 更改为fred

答案 1 :(得分:1)

您希望呈现到HTML HEAD中的内容看起来无效。

Oded是正确的,源文档中没有fred元素,只有一个属性值为fred。

您的其中一个模板还提到了在源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>

干编码,ymmv。