使用一个简单的 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>
<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:fn=""><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:template></xsl:stylesheet>