XML to create sortable, paginated data display pages _xml/rss

Source: Internet
Author: User
Tags cdata xpath xsl xsl file xslt

In web development, we often encounter paging display and sorting data recordset, which use server-side code and database technology is a very easy thing, such as: ASP, PHP, JSP and so on. However, if you want to display more than one record on the client side, sorting is a very frustrating thing. We take advantage of the extensible Markup Language (XML, Extensible Markup Language) and extensible Stylesheet Language Transformations (XSLT, extensible Style Single Language conversion), Combined with XML path Language (xpath,xml path Language), it is easy to write simple code. This method avoids the process of dealing with the server frequently, saves the time that the data displays, the viewer can see the result without waiting, also can reduce the burden of the server. Other than that. The separation of data storage and data display by XML and XSLT technology can also allow our code to be reused, greatly reducing the burden on programmers to write code.


Below, we implement our functions step-by-step.





First: Create an XSLT





The first line of the XSLT style sheet identifies the XML specification version that the XML complies with, and then the namespace used to indicate the style sheet, where we write in the official version of the XSL specification, rather than using the XSL draft:


<xsl:stylesheet xmlns:xsl= "Http://www.w3.org/TR/WD-xsl" >


Note: There is a big difference between the two in the function and the wording.


<?xml version= "1.0"?>


<xsl:stylesheet xmlns:xsl= "Http://www.w3.org/1999/XSL/Transform" >


Next, we define the template tags in the XSLT:





<xsl:template match= "/" >


<xsl:apply-templates select= "/customer Relationship table"/>


</xsl:template>





<xsl:template match= "/Customer Relationship Table" ></xsl:template>





We write the style to be displayed in the template. We use HTML data islands to store our data, which can take advantage of SQL Server 2000 XML queries, and for databases that do not support XML, we can write our own components to convert the data into XML format, and then put it in the data island. There are two ways to use a data island in HTML:


The first is to embed the data directly, as follows:


<xml id= ' Data ' >


< customer Relationship Table >


< customer > per data </customer >


</Customer Relationship Table >


</XML>


The second is to refer to the external file through the SRC attribute, as follows:


<xml id= ' Data ' src= ' data.xml ' ></XML>


To use the data in the data island, you must refer to it by ID name, of course, because the XSLT file is also one of the XML format files, which can be implemented by this method:


<xml id= ' Style ' src= ' style.xsl ' ></XML>


We add a tag div to the page to show the result of our transformation:


<div id= "Displayarea" ></div>


Using XSLT to transform data in the data island, use the DOMDocument Transnode () method and display the results through the innerHTML attribute of the DIV:


displayarea.innerhtml = Data.transformnode (style.documentelement)





Step two: Enable the client to sort the function





We first set a default sort field, where we select "ordinal" as the default sort key, and in ascending order, add the sort tag in the XSLT:


<xsl:for-each select= "Customer" >


<xsl:sort select= "ordinal" order= "descending" data-type= "number"/>


</xsl:for-each>


Next, we add the sort function to the stylesheet so that we can respond to the user's actions, we added the onclick event on each column of the header, which calls the sort () function, which allows the user to sort the column by clicking the header.


<TD onclick= "Sort (' serial number ')" > Serial number </td>


The statement for the Sort () function looks like this:


Function Sort (Strfield)





Dim SortField


Dim Sortorderattribute





"Gets the property value of the original sort field


Set SortField = Style.XMLDocument.selectSingleNode ("//xsl:sort/@select")





"Gets the order attribute value of the original sort


Set Sortorderattribute = Style.XMLDocument.selectSingleNode ("//xsl:sort/@order")





"If we have sorted by the fields of the columns we clicked, we have to change the order of the sort;


"Otherwise, we just need to sort by the default order of the newly clicked column fields.


If sortfield.value = Strfield Or sortfield.value = "./*[0]" Then


If sortorderattribute.value = "Descending" Then


Sortorderattribute.value = "Ascending"


Else


Sortorderattribute.value = "Descending"


End If


Else


Sortfield.value = Strfield


Sortorderattribute.value = "Ascending"


End If





Set SortField = Nothing


Set Sortorderattribute = Nothing


' Output sorted results


displayarea.innerhtml = Data.transformnode (style.documentelement)





End Function


Below, we implement the number of records displayed per page and set the function of the front page and the back page. Use the span tag to display the total number of pages, total pages, and records currently displayed. We default to display 6 records per page, save the value with variable intrecordsperpage:


<table width= "100%" border= "0" style= "font-size:9pt" >


<tr>


<TD align= "left" ><b> <span id= "currentpage" ></span> page total <span id= "PageCount" ></span > Page Total <span id= "RecordCount" ></span> Records </b></td>


<TD align= "Right" ><b> records per page: <input onblur= "Setrecordsperpage ()" id= "Recordsperpage" style= " vertical-align:middle;height:15pt;width:30px "/></b></td>


<TD align= "Right" >


<span id= "Paging" >


<input type= "button" onclick= "FirstPage ()" value= "first page"/>


<input type= "button" onclick= "PreviousPage (1)" value= "Previous page"/>


<input type= "button" onclick= "NextPage (1)" value= "next page"/>


<input type= "button" onclick= "LastPage ()" value= "last Page"/>


</span>


</td>


</tr>


</table>


The following is an example of how the process of converting different pages is done using the "next" button. Depending on the parameter intpage, the function determines the number of records to display and the corresponding page, and the change in the value of each button is achieved by dynamically changing the contents of the XSL DOM:


Function NextPage (intpage)





Dim Strdisplay


Dim Strdaterange





If CInt (CSTR (intpage) * Intrecordsperpage) < _


Data.selectnodes ("/Customer relationship Sheet/customer"). Length Then


Intpage = CInt (intpage) + 1





Style.XMLDocument.selectNodes ("//@OnClick") _


(1). Value = "PreviousPage (& Intpage &)"





Style.XMLDocument.selectNodes ("//@OnClick") _


(2). Value = "NextPage (& Intpage &)"





Style.XMLDocument.selectNodes _


("//xsl:for-each/@select") (1). Value = _


"./customer [position () <=" & (CStr (Intpage) _


* intrecordsperpage) & "and position () >" _


& (CInt (intpage)-1) * Intrecordsperpage & _


"]"





Redisplay (intpage)





End If





End Function


Let's take a look at the function setrecordsperpage () that sets the number of record bars per page, which is implemented by dynamically modifying the value of the Select property of the Xsl:for-each. Use XPath to traverse those nodes that meet the node position greater than 0 and the node position is less than the number of records plus 1 per page. The main statement is the following line:


Style.XMLDocument.selectNodes ("//xsl:for-each/@select") (1). _


Value = "./customer [Position () < & Intrecordsperpage + 1 &" and "&" position () > 0] "


So far, our page can not only achieve sorting, but also to achieve dynamic changes in the display of the number of records per page function, in order to achieve the requirements of reuse, we can also make further improvements. XPath is a powerful tool for XML/XSLT application development, and you can use wildcards in XPath to make XSLT style sheet files completely independent of your data node name. Therefore, when we change the XML data, as long as we do not change the hierarchical relationship of the nodes, you can use it without changing the XSLT. For example, in this example, you can add or remove certain fields, or add and delete some records, directly using the XSLT in this example, not only can display the data normally in the table, but also the normal sorting and paging.


Here we will analyze how it is achieved. For example, the following hierarchical relationships:


< customer Relationship Table >


< Customer >


< serial number ></>


< name ></name >


< e-mail ></email >


</Customer >


</Customer Relationship Table >


If there is a sentence in our XSLT that chooses the template:


<xsl:apply-templates select= "/customer Relationship table"/>


To achieve versatility, we can use wildcard characters:


<xsl:apply-templates select= "/*"/>


Here we use the sub operator "/", which selects all nodes under the root, the difference between the two is that the "/Customer Relationship table" selects the Customer relationship table child nodes under the root, and "/*" selects all the direct child nodes under the root, which are completely equivalent in the XML data format above.


For the following For-each loops:


<xsl:for-each select= "Customer" >


<xsl:sort select= "serial number" order= "Ascending"/>


</xsl:for-each>


We can change into this form:


<xsl:for-each select= "./*" >


<xsl:sort select= "./*[1]" order= "Ascending"/>


</xsl:for-each>


Here, "./*" means you should include all the first-level subnodes under the current node, and the syntax "./*[1]" represents the selection of the child node in the current node.


Another place to improve is the <xsl:value-of select= "serial number"/&gt, we can change it to <xsl:value-of select= "." /&gt, which indicates that the current node is selected in each loop.


In our function, we also use some hard code, if we do not make changes, our versatility will not be achieved, so we'll look at how to replace the hard code in the statement.


When we create the header, we use the <TD onclick= "sort (' ordinal ')" > Ordinal </td>, if there is no ordinal node in the XML data, there is obviously an error, in order to achieve versatility, We have customized a function getname to get the name of the node to display:


<td>


<xsl:attribute name= "OnClick" >


Sort (' <xsl:value-of select= ' user:getname (.) " /> "")


</xsl:attribute>


<xsl:value-of select= "User:getname (.)" />


</td>


Custom functions are a prominent feature of XSLT, and to use this feature, we have to define them with the msxml:script element, and we must specify a user-defined namespace when the style sheet is defined. Here's what we do with the custom function:


<xsl:stylesheet Xmlns:xsl=http://www.w3.org/1999/xsl/transform


Xmlns:msxsl= "Urn:schemas-microsoft-com:xslt"


Xmlns:user= "Http://lucky.myrice.com"


Version= "1.0" >


<msxsl:script language= "VBScript" implements-prefix= "User" >


<! [cdata[


function getName (node)


GetName = Node.item (0). nodename


End Function


}>


</msxsl:script>

In our XSLT file, we used two loops, and we made the corresponding changes, first: the place where the header was displayed was changed to <xsl:for-each select= "./*[1]/*", which is equivalent to <xsl:for-each select= "Customer relationship Table/customer [1]/*" >; the second loop is to display each row of records, change to <xsl:for-each select= "./*" >. There are other places that need to be changed, see the Complete source code section later. So we're done with the generic XSLT file, and no matter how many fields your XML data has or what the node name is, we can implement our functionality without having to change the XSLT file. The final browsing effect will be as shown in the following illustration:










The following are the contents of the complete style.xsl file:





&lt;?xml version= "1.0" encoding= "gb2312"?&gt;


&lt;xsl:stylesheet xmlns:xsl= "Http://www.w3.org/1999/XSL/Transform" xmlns:msxsl= "Urn:schemas-microsoft-com:xslt" Xmlns:user= "http://lucky.myrice.com" version= "1.0" &gt;


&lt;msxsl:script language= "VBScript" implements-prefix= "User" &gt;


&lt;! [cdata[


Function getName (node)


getName = node. Item (0). nodename


End Function


}&gt;


&lt;/msxsl:script&gt;





&lt;xsl:template match= "/" &gt;


&lt;xsl:apply-templates select= "/*"/&gt;


&lt;/xsl:template&gt;





&lt;xsl:template match= "*" &gt;


&lt;table width= "100%" border= "0" style= "font-size:9pt" &gt;


&lt;tr&gt;


&LT;TD align= "left" &gt;&lt;b&gt; &lt;span id= "currentpage" &gt;&lt;/span&gt; page total &lt;span id= "PageCount" &gt;&lt;/span &gt; Page Total &lt;span id= "RecordCount" &gt;&lt;/span&gt; Records &lt;/b&gt;&lt;/td&gt;


&LT;TD align= "Right" &gt;&lt;b&gt; records per page: &lt;input onblur= "Setrecordsperpage ()" id= "Recordsperpage" style= " vertical-align:middle;height:15pt;width:30px "/&gt;&lt;/b&gt;&lt;/td&gt;


&LT;TD align= "Right" &gt;


&lt;span id= "Paging" &gt;


&lt;input type= "button" onclick= "FirstPage ()" value= "first page"/&gt;


&lt;input type= "button" onclick= "PreviousPage (1)" value= "Previous page"/&gt;


&lt;input type= "button" onclick= "NextPage (1)" value= "next page"/&gt;


&lt;input type= "button" onclick= "LastPage ()" value= "last Page"/&gt;


&lt;/span&gt;


&lt;/td&gt;


&lt;/tr&gt;


&lt;/table&gt;


&lt;table width= "100%" border= "0" cellpadding= "0" cellspacing= "1" style= "font-size:11pt" bgcolor= "#0099ff" &gt;


&lt;tr bgcolor= "#FF6600" style= "cursor:hand;padding:5px" &gt;


&lt;xsl:for-each select= "./*[1]/*" &gt;


&LT;TD align= "center" &gt;


&lt;xsl:attribute name= "onclick" &gt;


Sort (' &lt;xsl:value-of select= ' user:getname (.) " /&gt; "")


&lt;/xsl:attribute&gt;


&lt;font color= "#EEEEEE" &gt;&lt;b&gt;&lt;u&gt;&lt;xsl:value-of select= "User:getname (.)" /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/font&gt;


&lt;/td&gt;


&lt;/xsl:for-each&gt;


&lt;/tr&gt;


&lt;xsl:for-each select= "./*[position () &lt; 6 and position () &gt; 0]" &gt;


&lt;xsl:sort select= "./*[1]" order= "Ascending"/&gt;


&lt;tr bgcolor= "#FFCCFF" &gt;


&lt;xsl:for-each select= "./*" &gt;


&lt;td&gt; &lt;xsl:value-of select= "." /&gt;&lt;/td&gt;


&lt;/xsl:for-each&gt;


&lt;/tr&gt;


&lt;/xsl:for-each&gt;


&lt;/Table&gt;


&lt;/xsl:template&gt;


&lt;/xsl:stylesheet&gt;


The following is the exam.htm file for the output:


&lt;HTML&gt;


&lt;Head&gt;


&lt;meta http=equiv= "Content-type" content= "text/html;charset=gb2312" &gt;


&lt;STYLE&gt;


Body {font-family: XXFarEastFont-font-size:9pt;}


th {font-family: song body; font-size:11pt; font-weight:bold;}


&lt;/STYLE&gt;


&lt;script language= "VBScript" &gt;


Option Explicit





Dim Intrecordsperpage ' The number of records displayed per page


Intrecordsperpage = 6 "The number of records displayed per page, default set to 6





' Update function to display page


Function Window_onload ()





"Shows the number of records set


Style.XMLDocument.selectNodes ("//xsl:for-each/@select") (1). Value = "./*[position () &lt;" &amp; Intrecordsperpage + 1 &amp; "and position () &gt; 0]"


Transform ()


Setpagecount ()





End Function





"For xml-xslt conversion and displays some information about the current record


Function transform ()





displayarea.innerhtml = Data.transformnode (style.documentelement)


Recordsperpage.value = Intrecordsperpage





End Function





' re-convert XML and display a status message


Function Redisplay (intpage)





Dim Strdisplay


Dim Intpagecount


Dim Intrecordcount





' Save state information


Intpagecount = pagecount.innerhtml


Intrecordcount = recordcount.innerhtml


Transform ()


' Show status information


pagecount.innerhtml = Intpagecount


recordcount.innerhtml = Intrecordcount


currentpage.innerhtml = Intpage





End Function





' Reorder and display


Function Sort (Strfield)





Dim SortField


Dim Sortorderattribute


' Get sort attribute value


Set SortField = Style.XMLDocument.selectSingleNode ("//xsl:sort/@select")


Set Sortorderattribute = Style.XMLDocument.selectSingleNode ("//xsl:sort/@order")





' Change the way of sorting


If sortfield.value = Strfield Or sortfield.value = "./*[0]" Then


If sortorderattribute.value = "Descending" Then


Sortorderattribute.value = "Ascending"


Else


Sortorderattribute.value = "Descending"


End If


Else


Sortfield.value = Strfield


Sortorderattribute.value = "Ascending"


End If





Set SortField = Nothing


Set Sortorderattribute = Nothing





Redisplay (currentpage.innerhtml)





End Function





' Reset the number of records per page


Function Setrecordsperpage ()





If IsNumeric (Recordsperpage.value) Then


Intrecordsperpage = CInt (recordsperpage.value)


Window_onload


End If





End Function





' Show page information


Function Setpagecount ()





Dim Inttotalrecords





pagecount.innerhtml = Getnumberofpages (inttotalrecords)


recordcount.innerhtml = Inttotalrecords


currentpage.innerhtml = 1





End Function





' Count total pages and total records


Function getnumberofpages (inttotalrecords)





Dim intpages





Inttotalrecords = Data.XMLDocument.selectNodes ("/*/*"). length


Intpages = Inttotalrecords/intrecordsperpage


If InStr (Intpages, ".") &gt; 0 Then


Intpages = CInt (left (intpages, InStr (Intpages, ".")) + 1


End If





Getnumberofpages = Intpages





End Function





' Next page ' processing


Function NextPage (intpage)





Dim Strdisplay


Dim Strdaterange





If CInt (CSTR (intpage) * Intrecordsperpage) &lt; Data.selectnodes ("/*/*"). Length Then


Intpage = CInt (intpage) + 1


Style.XMLDocument.selectNodes ("//@OnClick") (1). Value = "PreviousPage (&amp; Intpage &amp;)"


Style.XMLDocument.selectNodes ("//@OnClick") (2). Value = "NextPage (&amp; Intpage &amp;)"


Style.XMLDocument.selectNodes ("//xsl:for-each/@select") (1). Value = "./*[position () &lt;=" &amp; (CSTR (intpage) * intrecordsperpage) &amp; "and position () &gt;" &amp; CInt (Intpag e)-1 * intrecordsperpage &amp; "]"


Redisplay (intpage)


End If





End Function





"Process the previous page"


Function PreviousPage (intpage)





Dim Strdisplay


Dim Strdaterange





If intpage &gt; 1 Then


Intpage = CInt (intpage)-1


Style.XMLDocument.selectNodes ("//@OnClick") (1). Value = "PreviousPage (&amp; Intpage &amp;)"


Style.XMLDocument.selectNodes ("//@OnClick") (2). Value = "NextPage (&amp; Intpage &amp;)"


Style.XMLDocument.selectNodes ("//xsl:for-each/@select") (1). Value = "./*[position () &lt;=" &amp; (CSTR (intpage) * intrecordsperpage) &amp; "and position () &gt;" &amp; CInt (Intpag e)-1 * intrecordsperpage &amp; "]"


Redisplay (intpage)


End If





End Function





"First page" processing


Function FirstPage ()





Style.XMLDocument.selectNodes ("//@OnClick") (1). Value = "PreviousPage (1)"


Style.XMLDocument.selectNodes ("//@OnClick") (2). Value = "NextPage (1)"


Style.XMLDocument.selectNodes ("//xsl:for-each/@select") (1). Value = "./*[position () &lt;" &amp; Intrecordsperpage + 1 &amp; "and position () &gt; 0]"


Transform ()


Setpagecount ()





End Function





"Last page" processing


Function LastPage ()





Dim intTotalPages


Dim Inttotalrecords





intTotalPages = Getnumberofpages (inttotalrecords)


NextPage (intTotalPages-1)





End Function


&lt;/Script&gt;


&lt;/Head&gt;


&lt;body&gt;


&lt;p align= "center" style= "Font-weight:bold;font-size:12pt;color: #0000FF; border-bottom:3px double red; padding-bottom:5px "&gt; Customer Relationship Table &lt;/p&gt;


&lt;xml id= ' Data ' &gt;


&lt; Customer relationship table xmlns:dt= "Urn:schemas-microsoft-com:datatypes" &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;01&lt;/serial number &gt;&lt; name &gt;mi&lt;/name &gt;&lt; email &gt;water@21cn.com&lt;/e-mail &gt;&lt; /Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;02&lt;/serial number &gt;&lt; name &gt;uyi&lt;/name &gt;&lt; email &gt;lily@sina.com&lt;/e-mail &gt;&lt; /Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;03&lt;/serial number &gt;&lt; name &gt;uiyu&lt;/name &gt;&lt; email &gt;john@21cn.com&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;04&lt;/serial number &gt;&lt; name &gt;doug&lt;/name &gt;&lt; email &gt;karry@163.net&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;05&lt;/serial number &gt;&lt; name &gt;ellen&lt;/name &gt;&lt; email &gt;vivki@sina.com&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;06&lt;/serial number &gt;&lt; name &gt;frank&lt;/name &gt;&lt; Email &gt;net_lover@mengxianhui.com.cn &lt;/Email &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;07&lt;/serial number &gt;&lt; name &gt;greg&lt;/name &gt;&lt; email &gt;meng@mengxianhui.com&lt;/e-mail &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;08&lt;/serial number &gt;&lt; name &gt;harry&lt;/name &gt;&lt; email &gt;sunny@xianhui.net&lt;/e-mail &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;09&lt;/serial number &gt;&lt; name &gt;ingrid&lt;/name &gt;&lt; email &gt;cathy@hotmail.com&lt;/e-mail &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;10&lt;/serial number &gt;&lt; name &gt;jeff&lt;/name &gt;&lt; email &gt;your@mxh.com&lt;/e-mail &gt;&lt; /Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;11&lt;/serial number &gt;&lt; name &gt;kelly&lt;/name &gt;&lt; Email &gt;Iloveyou@mengxianhui.com&lt; /email &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;12&lt;/serial number &gt;&lt; name &gt;larry&lt;/name &gt;&lt; Email &gt;smilling@mengxianhui.com&lt; /email &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;13&lt;/serial number &gt;&lt; name &gt;mark&lt;/name &gt;&lt; email &gt;money@21cn.com&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;14&lt;/serial number &gt;&lt; name &gt;nancy&lt;/name &gt;&lt; email &gt;www@yahoo.com&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;15&lt;/serial number &gt;&lt; name &gt;peter&lt;/name &gt;&lt; email &gt;dotnet@aol.com&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;16&lt;/serial number &gt;&lt; name &gt;rachel&lt;/name &gt;&lt; Email &gt;billgates@microsoft.com&lt; /email &gt;&lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;17&lt;/serial number &gt;&lt; name &gt;seth&lt;/name &gt;&lt; email &gt;flying@yous.net&lt;/e-mail &gt; &lt;/Customer &gt;


&lt; customer &gt;&lt; serial number dt:dt= "int" &gt;18&lt;/serial number &gt;&lt; name &gt;tim&lt;/name &gt;&lt; email &gt;agooyboy@lovegirl.com&lt;/e-mail &gt;&lt;/Customer &gt;


&lt;/Customer Relationship Table &gt;


&lt;/XML&gt;


&lt;xml id= ' Style ' src= ' style.xsl ' &gt;&lt;/XML&gt;


&lt;div id= "Displayarea" &gt;&lt;/div&gt;


&lt;table border= "0" width= "100%" style= "font-size:11pt"; &gt;


&lt;tr&gt;


&LT;TD align= "Right" &gt; Source: "&lt;a href=" http://lucky.myrice.com "&gt; Mengxian the Wonderful World &lt;/a&gt;" &lt;/td&gt;


&lt;/tr&gt;


&lt;/table&gt;


&lt;/body&gt;


&lt;/HTML&gt;





Copy the contents of the above to the local computer, save the corresponding file separately, in the ie5+ and xml3.0+ environment can see the effect!


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.