Помогите начать работу с XML -> HTML через XSLT - PullRequest
1 голос
/ 11 января 2010

Может кто-нибудь начать меня с преобразования 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>

Когда я выполняю преобразование с использованием объекта XslCompiledTransform из C #, я получаю базовый 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;
}

Любая помощь с благодарностью.

Ross

(кроме того, какой смысл в элементе xsl: decimal-format, если при использовании функции format-number я должен предоставить строку формата?)

Ответы [ 2 ]

1 голос
/ 11 января 2010

Контент, который вы хотите визуализировать в HTML-заголовке, выглядит недопустимым.

Одед правильно, у вас нет исходного элемента 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>

Сухой код, мммм.

1 голос
/ 11 января 2010

Это никогда не будет использовано, так как нет attribute или element с именем fred:

<xsl:template match="fred">

Вам нужно что-то вроде:

<xsl:template match="@name">

И, аналогично, раздел apply-templates, вызывающий этот атрибут, должен измениться на:

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

Исходя из структуры отправленного вами XML-файла, вам необходимо изменить каждое упоминание fred на order в вашем XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...