日期:2014-05-17  浏览次数:20622 次

xml转html例子
巧妙利用XSLT将XML数据转换成HTML时间:2005-09-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小]
  使用一个简单的 XSL 样式表就可以将 XML 数据转换成 HTML。随着 XML 规范的不断演进,在新的版本中满足每个人的需要似乎已经成为必要;不幸的是,进行简单的转换一直都困扰着规范。
  
  假设我有一个表示一个页面内容的 XML 数据,现在我想将其内容转换成布局。下面是我想要转换的 XML:
  
  <?xml version='1.0'?>
  <?xml-stylesheet type="text/xsl" href="article.xsl"?>
  <xml>
  <folders>
  <folder>
  <text>Folder 1</text>
  <files>
  <file>
  <text>File 1</text>
  <fields>
  <field>
  <data>
  <type>string</type>
  <length>50</length>
  <value>some data</value>
  </data>
  </field>
  </fields>
  </file>
  </files>
  </folder>
  </folders>
  </xml>
  
  这个内容表示一组文件夹、文件和域。每个文件夹包含文件,每个文件包含用于输入数据的域。文件夹组中的每个文件夹都将表现为一个 TABLE 的第一行的一个 TR 元素和一个 TD 元素。文件组中的每个文件都将表示为嵌套在文件夹 TR 元素中的一个 TABLE 元素的第一行的一个 TR 元素和一个 TD 元素。域组中的每个域都将在相关的文件中表现为一个 INPUT。
  
  为了实现这一想法,我们需要将遍历 XML 然后根据XSL 构建一个表。
  
  下面是用于这个转换的 XSL:
  
  <?xml version="1.0"?>
  <xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:fn="http://www.mycompany.com/mynamespace">
  <xsl:output method="html"/>
  
  <msxsl:script language="JScript" implements-prefix="fn">
  function getElementCount(nodelist, what) {
  var rtrn = 0;
  rtrn = nodelist[0].parentNode.selectNodes(what).length;
  return (rtrn + 1); //1 is added for filler TD
  }
  </msxsl:script>
  
  <xsl:template match="/">
  
  <TABLE CELLSPACING="0" CELLPADDING="0"
  WIDTH="100%" BORDER="0" ID="tblRoot" NAME="tblRoot"
  style="table-layout:fixed;">
  <TR>
  <xsl:for-each select="xml/folders/folder">
  <xsl:element name="TD">
  <xsl:attribute name="style">width:55px</xsl:attribute>
  <xsl:value-of select="text"/>
  </xsl:element>
  </xsl:for-each>
  <TD> </TD>
  </TR>
  
  <xsl:for-each select="xml/folders/folder">
  <TR>
  <xsl:element name="TD">
  <xsl:attribute name="colspan">
  <xsl:value-of select="fn:getElementCount(., 'folder')"/>
  </xsl:attribute>
  
  <TABLE CELLSPACING="0" CELLPADDING="0"
  WIDTH="100%" BORDER="0" style="table-layout:fixed;">
  <TR>
  <xsl:for-each select="files/file">
  <xsl:element name="TD">
  <xsl:attribute name="style">width:55px;</xsl:attribute>
  <xsl:value-of select="text"/>
  </xsl:element>
  </xsl:for-each>
  <TD> </TD>
  </TR>
  
  <xsl:for-each select="files/file">
  <TR>
  <xsl:element name="TD">
  <xsl:attribute name="colspan">
  <xsl:value-of select="fn:getElementCount(., 'file')"/>
  </xsl:attribute>
  
  <xsl:for-each select="fields/field">
  <xsl:element name="INPUT">
  <xsl:attribute name="type">text</xsl:attribute>
  <xsl:attribute name="maxlength">
  <xsl:value-of select="data/length"/>
  </xsl:attribute>
  <xsl:attribute name="value">
  <xsl:value-of select="data/value"/>
  </xsl:attribute>
  </xsl:element><BR/>
  </xsl:for-each>
  
  </xsl:element>
  </TR>
  </xsl:for-each>
  </TABLE>
  </xsl:element>
  </TR>
  </xsl:for-each>
  </TABLE>
  
  </xsl:templat