-- 作者:x5duan
-- 发布时间:7/5/2005 2:23:00 PM
-- 通过页面交互来组织XSLT转换XML文件的输出
最近开始学习XSLT,小有收获。可始光学习不成啊,总想拿来做点什么,就随便找了个例子来练手。 这个例子的主要目的就是通过交互界面,让用户输入数据,然后把输入数据传到XSLT来控制XML的显示输出。 功能很简单,闲话少说,直接看例子。 先生成XML源文件(rule.xml): <?xml version="1.0" encoding="GB2312"?> <rules> <rule> <event> <id>20406</id> <name>TFTP下载文件</name> </event> <action>drop</action> </rule> <rule> <event> <id>20407</id> <name>TFTP上传文件</name> </event> <action>block</action> </rule> <rule> <event> <id>21501</id> <name>Telnet登录成功</name> </event> <action>log</action> </rule> <rule> <event> <id>21502</id> <name>Telnet登录失败</name> </event> <action>log</action> </rule> </rules> 存成rule.xml文件。 然后就是XSL文件了(rule.xsl): <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:output method= "html"/> <xsl:param name="ename">undefined</xsl:param> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="rules"/> </body> </html> </xsl:template> <xsl:template match="rules"> <table width="400" align="center" border="1"> <tr> <td width="100">事件号</td> <td width="*">事件名</td> <td width="100">采取动作</td> </tr> <xsl:for-each select='rule[contains(event/name, $ename)]'> <xsl:sort select="event/id"/> <tr> <td><xsl:value-of select="event/id"/></td> <td><xsl:value-of select="event/name"/></td> <td><xsl:value-of select="action"/></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> 存成rule.xsl文件。 此XSL文件中惟一的需要注意的就是多了个<xsl:param name="ename">undefined</xsl:param>,外部交互也是通过修改此一参数值来实现的。我们可以在后面的HTML文件中看到是如何来修改的参数的。 XML文件和XSL文件都有了,还需要一个HTML的文件用于交互,如下: <HTML> <HEAD> <TITLE>Rule Search</TITLE> </HEAD> <script language="javascript"> function OutputDocument(number){ // load the xslt file var xslt = new ActiveXObject("Msxml2.XSLTemplate"); var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); xslDoc.async = false; xslDoc.resolveExternals = false; xslDoc.load("rule.xsl"); xslt.stylesheet = xslDoc; var xmlDoc = new ActiveXObject("Msxml2.DOMDocument"); xmlDoc.async = false; xmlDoc.resolveExternals = false; xmlDoc.load("rule.xml"); var xslProc = xslt.createProcessor(); xslProc.input = xmlDoc; //就是这里实现了修改XSL中的参数值!! xslProc.addParameter("ename", number); xslProc.transform(); return xslProc.output; } function ClickButton() { var txt = document.getElementById("ename").value; var str = OutputDocument(txt); this.frames.main.document.write(str); this.frames.main.document.close(); } </script> <BODY> <center>事件名包含:<input type="text" value="" id="ename" maxlength="16"/> <input type="button" value="搜索" onClick="ClickButton()"/></center> <iframe src="about:blank" id="main" name="main" width="100%" height="100%" scrolling="auto" frameborder="0"/> </BODY> </HTML> 将这三个文件放到同一个目录下面,打开此html文件,在输入框中填上“TFTP”(注意大小写),点“搜索”,看到结果了吧:-) 再填入“Telnet”,点“搜索”看看:-)
|