【问题标题】:Help getting started with XML -> HTML via XSLT通过 XSLT 帮助开始使用 XML -> HTML
【发布时间】:2010-01-11 15:44:17
【问题描述】:

任何人都可以让我开始将一些 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 元素的意义何在?)

【问题讨论】:

    标签: html xml xslt


    【解决方案1】:

    这永远不会被使用,因为没有名为fredattributeelement

    <xsl:template match="fred">
    

    你需要这样的东西:

    <xsl:template match="@name">
    

    同样,调用此属性的apply-templates 部分需要更改为:

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

    根据您发布的 XML 的结构,您需要在 XSLT 中将每次提到的 fred 更改为 order

    【讨论】:

    • 感谢您指出这一点。我太匆忙了,否则我会发布正确的 xslt 文件。我已经更正了原来的帖子,它现在适用于主要的“订单”细节,但不适用于线条。谢谢,罗斯
    【解决方案2】:

    您似乎想要呈现到 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。

    【讨论】:

    • 您好,感谢您指出这一点。我试图从一个更大的应用程序创建一个小型测试应用程序,并且没有正确更改节点/属性名称。现在至少我有一个可以工作的迷你测试应用程序——现在我需要找出我的主应用程序为什么不能工作。 StackOverflow 之类的论坛的一大优点是,一旦您按下“发布”,您自己的错误就会变得非常明显。再次感谢。罗斯
    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2017-11-06
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多