使用XSLT将XML数据转换为HTML布局 想把XML数据灵活地转换成网页上常见的布局吗?其实,一个简单的XSL样式表就能胜任这份工作。随着XML标准的演进,构建这种数据到界面的转换层,已经成为了许多开发场景下的标配。假设我们手头有一份描述页面内容的XML数据,我们的目标就是把它转换成一个结构清晰的
想把XML数据灵活地转换成网页上常见的布局吗?其实,一个简单的XSL样式表就能胜任这份工作。随着XML标准的演进,构建这种数据到界面的转换层,已经成为了许多开发场景下的标配。假设我们手头有一份描述页面内容的XML数据,我们的目标就是把它转换成一个结构清晰的HTML表格布局。下面就是我们将要处理的XML数据样本:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
这份数据清晰地定义了一个“文件夹-文件-数据域”的层级模型。每个文件夹可以包含多个文件,而每个文件则包含用于输入数据的多个域。我们的转换逻辑很直接:文件夹组中的每个folder元素,都将成为外层表格第一行的一个TR(表格行)中的一个TD(单元格)。相应地,文件组中的每个file元素,将表现为嵌套在对应文件夹行内的子表格的第一行中的一个TR和TD。至于最内层的域组,每个field元素最终会渲染成一个INPUT输入框。
话不多说,直接上代码。下面就是驱动这次转换的核心XSL样式表:
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:fn=http://www.aaa.com/aaa>
function getElementCount(nodelist, what){
var rtrn = 0;
rtrn = nodelist[0].parentNode.selectNodes(what).length;
return (rtrn + 1);//加1是为了填充一个空TD
}
WIDTH="100%" BORDER="0" ID="tblRoot" NAME="tblRoot"
style="table-layout:fixed;">
WIDTH="100%" BORDER="0" style="table-layout:fixed;">
仔细看这份样式表的开头,我们在stylesheet标记中声明了几个关键的命名空间:定义所有XSL转换标记的xsl核心命名空间;允许我们在样式表内创建自定义函数的msxsl命名空间;以及由msxsl:script元素创建的、用于封装这组用户定义函数的fn命名空间。这里自定义的getElementCount函数,正是用来计算每个TD元素的colspan属性值的核心。
转换的流程是这样的:首先,创建最外层的TABLE和第一行TR。在这行里,我们遍历XML中每一个folder元素,为它们各自生成一个TD。这里选择使用xsl:element标记是个关键,因为它赋予了我们更大的灵活性——允许添加自定义属性,或者像后续那样,通过执行一个函数来动态设置colspan。
在完成了文件夹的顶部标签行之后,接下来要为每个文件夹创建对应的内容行。每个文件夹行只包含一个TD,但它的colspan属性会被设置为“文件夹总数加一”。多加的那个“一”,是为了在固定布局样式的表格中填充必要的空白空间,确保布局稳固。为了得到这个colspan值,我们将当前上下文节点(由“.”指定)和要计算的节点名称(‘folder’)传入自定义函数。函数内部会定位到当前节点的父节点,然后执行XPath查询以获取指定名称节点的数量,最后返回该数量加一的结果。
在这个撑满整行的TD内部,我们再嵌入一个新的TABLE,用来展示该文件夹下的所有文件。从这一步开始,其处理逻辑就与外层表格的转换如出一辙了:先创建文件标签行,再为每个文件创建内容行。最终的步骤,便是在每个文件行内,遍历并添加其包含的所有数据域,将它们渲染成INPUT输入框。
当这样一个通用的布局结构构建完毕,真正的交互潜力才开始显现。你可以轻松地为其添加用户界面功能,例如,常见的选项卡效果:初始只显示一个文件夹或文件的内容,当用户点击对应的标签时,再隐藏其他行、显示目标行。实现这个功能,只需要为文件夹和文件的TD元素添加一个onclick的xsl:attribute元素,并将其值设置为一个自定义的脚本函数名即可。
当然,视觉呈现也至关重要。你可以在转换过程中,通过xsl:attribute为元素添加class属性,然后在独立的STYLE标签或外部CSS文件中定义这些类名,从而完全掌控最终页面的外观和风格。
总而言之,这个示例提供了一个坚实的基础,实现了在Web数据解决方案中常见的“文件夹-文件-域”视图的转换逻辑。通过XSLT的这种应用,数据和表现得以优雅地分离,为构建动态、结构清晰的Web界面提供了强大的可能性。如需深入了解相关技术规范,可以参考MSDN上提供的丰富资料。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述