使用XSLT将XML数据转换成HTML

来源:互联网 发布:java程序员超清壁纸 编辑:程序博客网 时间:2024/05/16 16:03
   使用一个简单的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。

      下面是用于这个转换的 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.aaa.com/aaa> 
<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>  

      在 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 规范的信息。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机淘宝店铺接不到买家消息怎么办 买了东西淘宝店铺没了怎么办 淘宝店铺直播间虚假交易违规怎么办 手机淘宝退款物流单号填错了怎么办 淘宝评价删除了卖家没有返现怎么办 想摆摊卖麻辣烫不知怎么摆怎么办 在淘宝卖东西买家退款不退货怎么办 在闲鱼网上买东西被骗了怎么办 开通花呗的手机号不用了怎么办 饿了么开业第一天没单量怎么办 淘宝新开店铺没有人来呀怎么办 刚开的淘宝店铺没有人买东西怎么办 开了一家龙虾店生意很淡怎么办? 新买的皮质小白鞋有点板脚怎么办 手机无效安装包与系统不兼容怎么办 发好的海参放进速冻后变小了怎么办 厨房地砖下面的下水管漏水怎么办? 埋在地下的暖气管漏水怎么办 安装个视频播放器视频全没了怎么办 奇迹mu圣导转职任务打不过怎么办 丈夫死后房产证过给妻子怎么办 学业与志愿活动冲突时你会怎么办 往宅正门前面有半园幕墙玻璃怎么办 模拟城市5石油抽干了怎么办 一户一宅我父亲没有宅基怎么办? 在日本坐新干线期间车票丢了怎么办 街电共享充电宝丢了怎么办 征兵体检时做过疝气手术怎么办 百度网盘手机储存空间不足怎么办 在家带孩子老公不给生活费怎么办 手机蚂蚁浏览器先锋资源没了怎么办 当你发现你的爱人和别人暧昧怎么办 当你的爱人不再爱的时候该怎么办 基督徒的婚姻不是上帝的旨意怎么办 音乐酒吧客人老是要上台唱歌怎么办 高一孩子学习没有动力家长怎么办 我不想当公司监事法人不同意怎么办 领导让我当组长我不想当怎么办 如果你是班委你不想当了怎么办 孩子读初一爱和同学打架怎么办 陌陌情感连线部分功能被限制怎么办