以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  通过页面交互来组织XSLT转换XML文件的输出  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=20159)


--  作者: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”,点“搜索”看看:-)


--  作者:prostickman
--  发布时间:8/25/2005 4:36:00 PM

--  
VeryVeryVeryVeryVeryVeryVery Good
--  作者:NewBieInXML
--  发布时间:8/30/2005 11:14:00 AM

--  
输入TFTP以及Telnet以后,什么都没显示啊?怎么回事呢?
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms