使用一个简单的xsl样式表就可以将xml数据转换成html。随着xml规范的不断演进,在新的版本中满足每个人的需要似乎已经成为必要;假设有一个表示一个页面内容的xml数据,现在想将其内容转换成布局。下面是想要转换的xml:
85fa80ee361e700c2be4d997bc9733c9
31fe81e98afd17e4b9a8a28bedee1cf1
b2a0af5a8fd26276da50279a1c63a57a
254d0476a3bbaede07403c5f35da3e25
59ef88518edd60e9f6a2c9f2c966ac0c
28f128881ce1cdc57a572953e91f7d0ffolder1273e21371c5d5e701d3c98517a0bfa41
c6a235960c38d509b87ca752283a5cb2
28897b20adb25fbae118a3f80f538dec
28f128881ce1cdc57a572953e91f7d0ffile1273e21371c5d5e701d3c98517a0bfa41
5d31de15119673d8345a6e7e4e3539c8
d737d0a06790df603d79bb2c76c86712
1d029f6197b5a3eb8a3fdf0a088ddf55
7674b22ef33c73b930516fd6bc30b7a3string47da3aec5fea7de36e415e6398f16561
d82af2074b26fcfe177e947839b5d381500a47fdba4028b9e1b40fb76257dcf69f
8487820b627113dd990f63dd2ef215f3somedata4b175f9a50d57c75316becd702e959dc
07b4fdd0136efc154b4b9d48cfcbbb9d
6d2ce49320ba9a8e638019ef6c9bc2ef
7e3a30f0b0961b04563491c9888611a7
a83812d91bc3e67c6d4248fcc5008811
917d3984ce33e8bdef33749ba625760b
506346dddbef7ce31b7ff0aa13ddacdf
c1a7601f3a9fa679b3cd6fdf4f6dbe8d
21118965b89073f60271ef4a3b5d3c58
这个内容表示一组文件夹、文件和域。每个文件夹包含文件,每个文件包含用于输入数据的域。文件夹组中的每个文件夹都将表现为一个 table 的第一行的一个 tr 元素和一个 td 元素。文件组中的每个文件都将表示为嵌套在文件夹 tr 元素中的一个 table 元素的第一行的一个 tr 元素和一个 td 元素。域组中的每个域都将在相关的文件中表现为一个 input。
下面是用于这个转换的 xsl:
<?xmlversion="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.aaa.com/aaa>
<xsl:outputmethod="html"/>
<msxsl:scriptlanguage="jscript"implements-prefix="fn">
functiongetelementcount(nodelist,what){
varrtrn=0;
rtrn=nodelist[0].parentnode.selectnodes(what).length;
return(rtrn 1);//1isaddedforfillertd
}
</msxsl:script>
<xsl:templatematch="/">
<tablecellspacing="0"cellpadding="0"
width="100%"border="0"id="tblroot"name="tblroot"
style="table-layout:fixed;">
<tr>
<xsl:for-eachselect="xml/folders/folder">
<xsl:elementname="td">
<xsl:attributename="style">width:55px</xsl:attribute>
<xsl:value-ofselect="text"/>
</xsl:element>
</xsl:for-each>
<td></td>
</tr>
<xsl:for-eachselect="xml/folders/folder">
<tr>
<xsl:elementname="td">
<xsl:attributename="colspan">
<xsl:value-ofselect="fn:getelementcount(.,'folder')"/>
</xsl:attribute>
<tablecellspacing="0"cellpadding="0"
width="100%"border="0"style="table-layout:fixed;">
<tr>
<xsl:for-eachselect="files/file">
<xsl:elementname="td">
<xsl:attributename="style">width:55px;</xsl:attribute>
<xsl:value-ofselect="text"/>
</xsl:element>
</xsl:for-each>
<td></td>
</tr>
<xsl:for-eachselect="files/file">
<tr>
<xsl:elementname="td">
<xsl:attributename="colspan">
<xsl:value-ofselect="fn:getelementcount(.,'file')"/>
</xsl:attribute>
<xsl:for-eachselect="fields/field">
<xsl:elementname="input">
<xsl:attributename="type">text</xsl:attribute>
<xsl:attributename="maxlength">
<xsl:value-ofselect="data/length"/>
</xsl:attribute>
<xsl:attributename="value">
<xsl:value-ofselect="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>
在 stylesheet 标记中,设置了几个命名空间,包括定义所有xsl 转换标记的xsl 命名空间。能够让我们创建可以在样式表中使用的用户函数的msxml 命名空间。使用它得到所有的子元素,以便得到一个 td 标记的一个 colspan 属性集。用于加入一组用户定义的函数的fn 命名空间,该命名空间由msxml:script element 创建。
然后,我们创建外部 table 和第一个 tr。在 tr 中,为 xml 中指定的每个文件夹创建一个 td。使用了 xsl:element 标记,因为它允许添加自定义属性或者执行一个函数来为另一个 td 元素中的 colspan 属性设置一个属性。
在为每个文件夹创建了所需的 td 之后,开始为每个文件夹创建 tr。只向这个tr 添加一个 td,但是将它的 colspan 属性设为等于文件夹组中文件夹标记的数量再加一。多出的一是用来在一个固定布局样式的 table 中填充空格用的。
为了得到 colspan,传入当前的上下文(在这里由“.”指定)和计算的节点的名字。在函数中,得到当前的上下文,paraentnode,和 xpath 查询中指定的节点的数量。然后函数返回这个数量加上一以填充 td。
有了这个 td,在其中嵌入另外一个 table,该 table 包含文件组中的每个文件。从这一点开始,其过程就与外部 table 转换一样。最后的步骤是添加每个文件中的域。
一旦完成了通用布局,就可以开始添加用户界面功能了,比如说隐藏掉其它的文件夹和文件行,直到用户点击了相关的选项卡。这一功能可以通过编写支持这一功能的脚本来实现,添加一个 onclick xsl:attribute 元素到文件夹和文件 td 元素,然后将它的值设置为脚本函数的名字。
最后,在通用功能完成之后,你可以添加class xsl:attributes 并在 style 或 css 中添加相关的classnames 得到你想要的外观。
这个例子为在部署 web 数据解决方案中用到的 file-folder-field 视图创建了一个基础。访问 msdn 找到更多有关microsoft 的 xml 规范的信息。
以上就是详细介绍将xml数据转换成html的示例代码的详细内容。