亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

如何巧妙利用XSLT將XML數據轉換成HTML

2024-09-05 20:54:56
字體:
來源:轉載
供稿:網友
使用一個簡單的 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: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 轉換一樣。最后的步驟是添加每個文件中的域。這次我沒有再創建嵌入的 TABLE,只是把這些域添加到當前的 TD 中。一旦我完成了通用布局,我就可以開始添加用戶界面功能了,比如說隱藏掉其它的文件夾和文件行,直到用戶點擊了相關的選項卡。這一功能可以通過編寫支持這一功能的腳本來實現,添加一個 onclick xsl:attribute 元素到文件夾和文件 TD 元素,然后將它的值設置為腳本函數的名字。

最后,在通用功能完成之后,你可以添加class xsl:attributes 并在 STYLE 或 CSS 中添加相關的classNames 得到你想要的外觀。這個例子為在部署 Web 數據解決方案中用到的 File-Folder-Field 視圖創建了一個基礎。訪問 MSDN 找到更多有關Microsoft 的 XML 規范的信息。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲成人| 日韩电影免费观看在线观看| 91久久精品国产91久久| 亚洲国产精品久久久久久| 深夜福利亚洲导航| 欧美日韩美女视频| 国产欧美日韩丝袜精品一区| 国产精品福利久久久| 亚洲片在线观看| 久久亚洲电影天堂| 91成人免费观看网站| 亚洲黄页网在线观看| 欧美午夜精品久久久久久人妖| 欧美精品在线免费播放| 日韩欧美国产高清91| 成人激情视频小说免费下载| 国产精品国产三级国产专播精品人| 国内精品国产三级国产在线专| 亚洲图片欧美日产| 亚洲国产中文字幕在线观看| 国产日本欧美一区二区三区在线| 亚洲电影第1页| 国产精品av在线| 亚洲国产又黄又爽女人高潮的| 26uuu国产精品视频| 国产精品免费观看在线| 亚洲男子天堂网| 亚洲成色777777女色窝| 亚洲最大中文字幕| 国产精品成人av性教育| 日韩中文字幕久久| 亚洲日本aⅴ片在线观看香蕉| 国产美女高潮久久白浆| 亚洲一二在线观看| 欧美午夜片欧美片在线观看| 日韩精品亚洲元码| 国产中文字幕日韩| www.久久色.com| 国产精品男女猛烈高潮激情| 亚洲码在线观看| 欧美床上激情在线观看| 永久免费毛片在线播放不卡| 欧美视频专区一二在线观看| 国产精品成人观看视频国产奇米| 亚洲欧美日韩精品| 国产精品福利网站| 久久综合电影一区| 国产99久久久欧美黑人| 欧美亚洲另类视频| 国产精品久久77777| 丁香五六月婷婷久久激情| 亚洲电影免费观看高清完整版在线观看| 久久久久久美女| 高清欧美电影在线| 日韩中文字幕欧美| 国产精品久久一区| 久久这里有精品视频| 久久中文字幕一区| 伊人久久综合97精品| 国产精品视频自在线| 亚洲精品国产精品国自产观看浪潮| 日韩中文字幕视频在线观看| 777午夜精品福利在线观看| 久久精品中文字幕一区| 成人久久一区二区| 国产成人精品在线视频| 热草久综合在线| 在线播放国产一区中文字幕剧情欧美| 97视频色精品| 97人人做人人爱| 久久99热精品这里久久精品| 91精品视频免费看| 国产精品一区二区av影院萌芽| 久久中国妇女中文字幕| 久久资源免费视频| 亚洲欧洲日产国码av系列天堂| 亚洲美女视频网站| 欧美伊久线香蕉线新在线| 亚洲国产成人久久综合一区| 国产成人精品午夜| 欧美日韩国产综合新一区| 亚洲日本成人女熟在线观看| 亚洲国产精品va在线看黑人动漫| 欧美另类老肥妇| 欧美疯狂xxxx大交乱88av| 国产丝袜视频一区| 97视频人免费观看| 国产精品第七十二页| 久久久久久免费精品| 亚洲福利小视频| 亚洲加勒比久久88色综合| 伊人伊成久久人综合网站| 欧美成人精品h版在线观看| 亚洲人成亚洲人成在线观看| 欧美日韩福利在线观看| 亚洲国产欧美精品| 久久久久久com| 精品久久久久久久久国产字幕| 亚洲大胆人体av| 日本韩国欧美精品大片卡二| 青青草精品毛片| 欧美孕妇与黑人孕交| 这里只有精品在线播放| www.国产一区| zzjj国产精品一区二区| 久久精品视频一| 亚洲丁香婷深爱综合| 午夜剧场成人观在线视频免费观看| 在线成人免费网站| 国产精品日韩在线观看| 中文字幕国产精品久久| 国产国语刺激对白av不卡| 亚洲美女av黄| 久久精品国产91精品亚洲| 欧美电影在线观看网站| 欧美日韩亚洲网| www.美女亚洲精品| 久久免费视频观看| 亚洲精品一区二区三区婷婷月| 日韩av在线网址| 97精品国产97久久久久久| 国产91热爆ts人妖在线| 欧美日韩免费观看中文| 日韩av电影中文字幕| 九九热精品在线| 久久亚洲精品网站| 91探花福利精品国产自产在线| 高潮白浆女日韩av免费看| 欧美日韩国产黄| 91久久精品久久国产性色也91| 97福利一区二区| 国产成人97精品免费看片| 欧美美女15p| 国产又爽又黄的激情精品视频| 国产精品一区二区久久久久| 亚洲视频欧美视频| 亚洲天堂av综合网| 久久精品国产亚洲7777| 91精品视频专区| 国产精品91久久久| 日韩中文字幕视频在线观看| 色综合久久久888| 欧美专区福利在线| www.久久久久| 日韩精品免费综合视频在线播放| 欧美激情国产日韩精品一区18| 欧美日韩中文字幕日韩欧美| 日韩欧美主播在线| 欧美激情久久久| 欧美一级bbbbb性bbbb喷潮片| 激情av一区二区| 夜夜躁日日躁狠狠久久88av| 91高清视频免费| 国产精品高清免费在线观看| 亚洲片国产一区一级在线观看| 8050国产精品久久久久久| 国产精品网站大全| 国产精品成人播放| 日韩精品视频三区| 日韩中文字幕视频在线| 中文字幕亚洲国产| 国产成人精品网站| 亚洲欧美国产一本综合首页| 日韩亚洲成人av在线|