JS+XMLDOM+XSL:实现中英文界面切换、排序、分页显示、增删改查XML文件数据源

【转自happyhippy】ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
0. 有关JS、XMLDOM、XSLT的基础知识,可以参考作者前面的三篇学习笔记: ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
《JS学习笔记》 ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
http://www.cnblogs.com/happyhippy/archive/2007/07/24/829007.html ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
《XML DOM学习笔记(JS) 》 ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
http://www.cnblogs.com/happyhippy/archive/2007/07/24/829001.html ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
《XSLT学习笔记 》 ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
http://www.cnblogs.com/happyhippy/archive/2007/07/25/831576.html ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
1. 中英文切换: ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
原本打算是用一个XML文件(Language.xml)作为语言的配置文件,然后在HTML/JS中传入所选择得语言种类,来加载不同的XML节点,我最原始的思路: ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<!--langg传文件名:zh或en-->
<xsl:param name="langg"></xsl:param>
<xsl:variable name="languag" select="document($filename)/language/$langg"></xsl:variable>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
Language.XML ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<?xml version="1.0" encoding="gb2312"?>
<language>
   
<zh>
       
<title>员工信息</title>
       
<btnAdd>新建员工</btnAdd>
       
<column1>姓名</column1>
       
<column2>部门</column2>
       
<column3>备注</column3>
       
<column4>删除</column4>
       
<CurrentPage>当前页码</CurrentPage>
       
<TotelPage>总页数</TotelPage>
       
<TotelCount>总记录数</TotelCount>       
       
<FirstPage>首页</FirstPage>
       
<PrevPage>前一页</PrevPage>
       
<NextPage>后一页</NextPage>
       
<LastPage>最后一页</LastPage>
   
</zh>
   
<en>
       
<title>Employee Information</title>
       
<btnAdd>Add New Employee</btnAdd>
       
<column1>Name</column1>
       
<column2>Department</column2>
       
<column3>Memo</column3>
       
<column4>Delete</column4>
       
<CurrentPage>Current Page</CurrentPage>
       
<TotelPage>Totel Page Count</TotelPage>
       
<TotelCount>Totel Record Count</TotelCount>
       
<FirstPage>First Page</FirstPage>
       
<PrevPage>Previous Page</PrevPage>
       
<NextPage>Next Page</NextPage>
       
<LastPage>Last Page</LastPage>
   
</en>
</language>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
但在实践过程中,发现XSL中document函数后的Xpath不能带参数变量,只好改成两个文件(zh.xml和en.xml),通过HTML/JS传入所选择的语言的种类,来加载不同的语言所对应的配置文件: ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<!--langg传文件名:zh或en-->
<xsl:param name="langg"></xsl:param>
<xsl:variable name="filename" select="concat($langg,'.xml')"></xsl:variable>
<xsl:variable name="languag" select="document($filename)/language"></xsl:variable>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
zh.xml ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<?xml version="1.0" encoding="gb2312"?>
<language>
   
<title>员工信息</title>
   
<btnAdd>新建员工</btnAdd>
   
<column1>姓名</column1>
   
<column2>部门</column2>
   
<column3>备注</column3>
   
<column4>删除</column4>
   
<CurrentPage>当前页码</CurrentPage>
   
<TotelPage>总页数</TotelPage>
   
<TotelCount>总记录数</TotelCount>
   
<FirstPage>首页</FirstPage>
   
<PrevPage>前一页</PrevPage>
   
<NextPage>后一页</NextPage>
   
<LastPage>最后一页</LastPage>
   
<add>
       
<NotNull>员工姓名不能为空!</NotNull>
       
<NameRepeat>姓名重复,请重新输入姓名!</NameRepeat>
       
<Save>保存</Save>
       
<Cancel>取消</Cancel>
       
<Title>员工信息</Title>
       
<Name>姓名</Name>
       
<Dept>部门</Dept>
       
<Memo>备注</Memo>
   
</add>
   
<del>
       
<Text1>确定删除 </Text1>
       
<Text2> 记录吗?</Text2>
   
</del>
   
<edit>
   
</edit>
</language>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
en.xml ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<?xml version="1.0" encoding="gb2312"?>
<language>
   
<title>Employee Information</title>
   
<btnAdd>Add New Employee</btnAdd>
   
<column1>Name</column1>
   
<column2>Department</column2>
   
<column3>Memo</column3>
   
<column4>Delete</column4>
   
<CurrentPage>Current Page</CurrentPage>
   
<TotelPage>Totel Page Count</TotelPage>
   
<TotelCount>Totel Record Count</TotelCount>
   
<FirstPage>First Page</FirstPage>
   
<PrevPage>Previous Page</PrevPage>
   
<NextPage>Next Page</NextPage>
   
<LastPage>Last Page</LastPage>
   
<add>
       
<NotNull>You must enter employee name!</NotNull>
       
<NameRepeat>Name is already exists,please input again!</NameRepeat>
       
<Save>Save</Save>
       
<Cancel>Cancel</Cancel>
       
<Title>Employee Information</Title>
       
<Name>Name</Name>
       
<Dept>Department</Dept>
       
<Memo>Memo</Memo>
   
</add>
   
<del>
       
<Text1>Do you confirm to delete </Text1>
       
<Text2> record?</Text2>
   
</del>
</language>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
2. 分页:ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
JS中ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
xslProcessor.addParameter("currentPage", currentPage);
xslProcessor.addParameter(
"totelPage", GetTotlePage());
xslProcessor.addParameter(
"totelEmployee", GetTotleEmplyee());
xslProcessor.addParameter(
"pageSize", pageSize);
//定义要读取的Employee记录的范围
xslProcessor.addParameter("startEmployee", (currentPage-1)*pageSize);
xslProcessor.addParameter(
"endEmployee", currentPage*pageSize);
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
xsl中,只读取一定范围的节点(startEmployee<position()<=endEmployee): ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<xslor-each select="//employee[position()&gt;$startEmployee and position()&lt;=$endEmployee]">
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
3. 排序: ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
JS中: ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
xslProcessor.addParameter("order", order);//order是排序依据的列名
xslProcessor.addParameter("scending", scending);//顺序还是倒序,做得很粗糙,尚待完善
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
XSL中ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<xsl:sort select="*[name()=$order]" order="{$scending}"/>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
//很多文章介绍说可以这样<xsl:sort select="$order" order="{$scending}"/>,但在我自己的机器上测试不行的说 ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
4. 增删查改:基本的XMLDOM操作,直接看代码吧... ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
employee.xml ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<?xml version="1.0" encoding="gb2312"?>
<employees>
   
<employee>
       
<name>a</name>
       
<dept>dept1</dept>
       
<memo>1</memo>
   
</employee>
   
<employee>
       
<name>b</name>
       
<dept>dept2</dept>
       
<memo>2</memo>
   
</employee>
   
<employee>
       
<name>c</name>
       
<dept>dept3</dept>
       
<memo>3</memo>
   
</employee>
   
<employee>
       
<name>d</name>
       
<dept>dept4</dept>
       
<memo>4</memo>
   
</employee>
   
<employee>
       
<name>e</name>
       
<dept>dept5</dept>
       
<memo>5</memo>
   
</employee>
   
<employee>
       
<name>f</name>
       
<dept>dept6</dept>
       
<memo>6</memo>
   
</employee>
   
<employee>
       
<name>g</name>
       
<dept>dept7</dept>
       
<memo>7</memo>
   
</employee>
   
<employee>
       
<name>h</name>
       
<dept>dept8</dept>
       
<memo>8</memo>
   
</employee>
</employees>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
employee.xsl ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlnssl="http://www.w3.org/1999/XSL/Transform";
                xmlns:msxsl
="urn:schemas-microsoft-comslt"
                version
="1.0">

<xsl:param name="currentPage"></xsl:param>
<xsl:param name="totelPage"></xsl:param>
<xsl:param name="totelEmployee"></xsl:param>
<xsl:param name="pageSize"></xsl:param>
<xsl:param name="startEmployee"></xsl:param>
<xsl:param name="endEmployee"></xsl:param>
<xsl:param name="order"></xsl:param>
<xsl:param name="scending"></xsl:param>
<xsl:param name="langg"></xsl:param>

<xsl:variable name="filename" select="concat($langg,'.xml')"></xsl:variable>
<xsl:variable name="languag" select="document($filename)/language"></xsl:variable>
<xsl:template match="/">
<table border="1" cellspacing="0" style="font-size:14pt">
   
<tbody>
       
<tr align="center" bgcolor="#33CCCC">
           
<th><a href="javascript:sort('name')"><xsl:value-of select="$languag/column1"/></a></th>
           
<th><a href="javascript:sort('dept')"><xsl:value-of select="$languag/column2"/></a></th>
           
<th><a href="javascript:sort('memo')"><xsl:value-of select="$languag/column3"/></a></th>
           
<th>              </th>
       
</tr>
       
<xslor-each select="//employee[position()&gt;$startEmployee and position()&lt;=$endEmployee]">
       
<xsl:sort select="*[name()=$order]" order="{$scending}"/>
           
<tr align="center">   
               
<xsl:variable name="name" select="name"></xsl:variable>
               
<td><a href="javascript:Edit('{$name}')"><xsl:value-of select="name"/></a></td>
               
<td><xsl:value-of select="dept"/></td>
               
<td><xsl:value-of select="memo"/></td>
               
<td><a href="javascriptelEmployee('{$name}')"><xsl:value-of select="$languag/column4"/></a></td>
           
</tr>
   
</xslor-each>
   
</tbody>
</table>
<br/>
<xsl:value-of select="$languag/CurrentPage"/><xsl:value-of select="$currentPage"></xsl:value-of> <xsl:value-of select="'  '"></xsl:value-of>
<xsl:value-of select="$languag/TotelPage"/><xsl:value-of select="$totelPage"></xsl:value-of><xsl:value-of select="'  '"></xsl:value-of>
<xsl:value-of select="$languag/TotelCount"/><xsl:value-of select="$totelEmployee"></xsl:value-of><xsl:value-of select="'  '"></xsl:value-of>
<xsl:choose>
   
<xsl:when test="$currentPage=1">
   
<xsl:value-of select="$languag/FirstPage"/><xsl:value-of select="$languag/PrevPage"/>  |
   
</xsl:when>
   
<xsltherwise>
     
<a href="javascriptirstPage()"><xsl:value-of select="$languag/FirstPage"/></a><a href="javascript:prevPage()"><xsl:value-of select="$languag/PrevPage"/></a>
   
</xsltherwise>
</xsl:choose>

<xsl:choose>
   
<xsl:when test="$currentPage=$totelPage">
 
<xsl:value-of select="$languag/NextPage"/><xsl:value-of select="$languag/LastPage"/>
   
</xsl:when>
   
<xsltherwise>
 
<a href="javascript:nextPage()"><xsl:value-of select="$languag/NextPage"/></a> | <a href="javascript:lastPage()"><xsl:value-of select="$languag/LastPage"/></a>
   
</xsltherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
list.html ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
ªCHí7^ö©zbbs.szblogs.comx=:†7Ðçû
<html>
   
<head>
       
<title>Employee Information</title>
   
</head>
   
<body>
       
<div>
           
<button align="middle" id="btnAdd" onclick="addEmployee()">新建员工</button>

           
<div align="right">
               
<a href="javascript:languageChange('zh')">中文版</a>|<a href="javascript:languageChange('en')">English Version</a>
           
</div>
       
</div>
       
<div id="divContent" align="center">
       
</div>
       
       
<script language="javascript" type="text/javascript">
           
var lngg = new ActiveXObject("MSXML2.DOMDocument");
           
var langg = "zh";
           
var scending = "ascending";
            lngg.load(
"language.xml");
           
function languageChange(str)
           
{               
                lnggRoot
= lngg.selectSingleNode("//" + str);
                btnAdd.value
= lnggRoot.selectSingleNode("btnAdd").childNodes[0].xml;
                langg
=str;
                showTable();
            }

           
//全局变量
            var currentPage = 1;
           
var pageSize = 5;
           
var order = "name";
           
           
//初始化
            var xml = new ActiveXObject("MSXML2.DOMDocument");
          xml.load(
"employee.xml");
           
var root=xml.documentElement;           
         
var xsl = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
          xsl.load(
"employee.xsl");           
         
var xslTemplate = new ActiveXObject("MSXML2.XSLTemplate");
          xslTemplate.stylesheet
= xsl;
         
var xslProcessor = xslTemplate.createProcessor(); 
          xslProcessor.input
= xml;
           
           
//总记录数
            function GetTotleEmplyee()