简单的XML到HTML表格

时间:2011-07-11 12:42:15

标签: html xml xslt html-table

我有一个类似以下的XML文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<mylist name="test">
    <title>--$title$- not found</title>
    <table>
        <header>
            <col name="firstname"      title="--$firstname$- not found"/>
            <col name="lastname"      title="--$lastname$- not found"/>
            <col name="country"        title="--$country$- not found"/>
      </header>
            <body>
                <row>
                <col name="firstname">John</col>
                <col name="lastname">Smith</col>
                <col name="country">ENGLAND</col>
              </row>
              <row>
              <col name="firstname">Peter</col>
                <col name="lastname">Scott</col>
                <col name="country">USA</col>
              </row>
        </body>
    </table>
</mylist> 

我需要将结果显示为HTML表格,如下所示:

enter image description here

有人可以帮忙吗?我不是XML / XSL,我只需要一次

4 个答案:

答案 0 :(得分:5)

试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>

  <xsl:template match="mylist">
    <html>
      <xsl:apply-templates />
    </html>
  </xsl:template>

  <xsl:template match="title">
    <head>
      <title><xsl:value-of select="." /></title>
    </head>
  </xsl:template>

  <xsl:template match="table">
    <table style="border: 1px solid black">
      <xsl:apply-templates />
    </table>
  </xsl:template>

  <xsl:template match="header">
    <thead>
      <tr>
        <xsl:apply-templates />
      </tr>
    </thead>
  </xsl:template>

  <xsl:template match="body">
    <tbody>
      <xsl:apply-templates />
    </tbody>
  </xsl:template>

  <xsl:template match="row">
    <tr>
      <xsl:apply-templates />
    </tr>
  </xsl:template>

  <xsl:template match="col[parent::header]">
    <th style="border: solid black 1px;"><xsl:value-of select="@name" /></th>
  </xsl:template>

  <xsl:template match="col[parent::row]">
    <td style="border: solid black 1px;"><xsl:value-of select="." /></td>
  </xsl:template>
</xsl:stylesheet>

它实际上会在每个<td><th>上放置一个样式属性,这意味着输出有点冗长,但它保持了XSLT的美观和优点。简单。

答案 1 :(得分:1)

即使col中的body元素的顺序不正确,此较短的转换也会生成所需结果:

-

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vColNames">
  <xsl:text>|</xsl:text>
  <xsl:for-each select="/*/*/header/col">
    <xsl:value-of select="concat(@name, '|')"/>
   </xsl:for-each>
 </xsl:variable>

 <xsl:template match="table">
     <table border="1">
      <xsl:apply-templates/>
     </table>
 </xsl:template>

 <xsl:template match="header">
  <thead>
   <tr>
    <xsl:apply-templates/>
   </tr>
  </thead>
 </xsl:template>

 <xsl:template match="header/col">
  <td><xsl:value-of select="@name"/></td>
 </xsl:template>

 <xsl:template match="body/row">
  <tr>
   <xsl:apply-templates select=
    "col[contains($vColNames,concat('|',@name, '|'))]">
     <xsl:sort select=
     "string-length(substring-before($vColNames, @name))"/>
   </xsl:apply-templates>
  </tr>
 </xsl:template>

 <xsl:template match="col">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

-

应用于此文档(基本上是提供的XML文档,但col中的body元素按混合顺序排列):

-

<mylist name="test">
    <title>--$title$- not found</title>
    <table>
        <header>
            <col name="firstname"      title="--$firstname$- not found"/>
            <col name="lastname"      title="--$lastname$- not found"/>
            <col name="country"        title="--$country$- not found"/>
        </header>
        <body>
            <row>
                <col name="lastname">Smith</col>
                <col name="firstname">John</col>
                <col name="country">ENGLAND</col>
            </row>
            <row>
                <col name="country">USA</col>
                <col name="firstname">Peter</col>
                <col name="lastname">Scott</col>
            </row>
        </body>
    </table>
</mylist>

产生了想要的正确结果

-

<table border="1">
   <thead>
      <tr>
         <td>firstname</td>
         <td>lastname</td>
         <td>country</td>
      </tr>
   </thead>
   <tr>
      <td>John</td>
      <td>Smith</td>
      <td>ENGLAND</td>
   </tr>
   <tr>
      <td>Peter</td>
      <td>Scott</td>
      <td>USA</td>
   </tr>
</table>

答案 2 :(得分:-2)

这可能听起来有点过分......但是如果找到并替换文本编辑器怎么样?

XSL是最好的解决方案,因为它是为它构建的。

如果您正在编写脚本,那么groovy具有良好的XML处理能力,可能会为您解决问题

答案 3 :(得分:-3)

你的意思是XSL?

如果可能,我会避免使用XSL,并使用您最喜欢的编程语言,FreeMarker或两者兼而有之。