站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Javascript 专题从 XSLT 样式表调用 JavaScript (转载 作者Nicholas Chase )

从 XSLT 样式表调用 JavaScript (转载 作者Nicholas Chase )

摘要: 从 XSLT 样式表调用 JavaScript (转载 作者Nicholas Chase )
<textarea readonly style="border:none;font-family:Courier New;line-height:150%;width:760px;overflow-y:visible"> 从 XSLT 样式表调用 JavaScript (转载 作者Nicholas Chase )
http://www-900.ibm.com/developerWorks/cn/xml/tips/x-tipxsltjs/index.shtml
样本文档
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1> <tr> <td>


<?xml version="1.0"?>



    

        John

        3

        9

        222

    

    

        Mary

        88

        76

        5

    

</td></tr></table>

创建组件
使用扩展元素或函数的第一步是定义要执行的代码。这涉及为代码定义新的名称空间及容器:

基本样式表 <table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1> <tr> <td>


<?xml version="1.0"?>



  

    

        function getResult (thisGuess) {

          var thisResult = parseInt(Math.random()*100);

          if (thisResult == parseInt(thisGuess)) {

             return "Correct!";

          } else {

             return "Wrong! The actual answer was "+thisResult+

                                                 ", not "+thisGuess+".";

          }

        }

    

  

  

      

  

</td></tr></table>

表面上,这是一个添加了两个新名称空间的典型样式表。第一个名称空间的前缀是 lxslt,告诉处理器哪个元素定义了新功能。第二个名称空间的前缀是 result,表明对新功能的一次调用。最后,extension-element-prefixes 属性让处理器知道哪个元素作为正常流的一部分不该被转换。(如同我们将看到的一样,它们仍然会返回一个值作为输出。)

组件本身指定从 result 名称空间前缀调用其内部的所有代码。它也让处理器知道哪些函数将从扩展元素调用,以及哪些函数将从扩展函数调用。脚本元素描述函数本身。

在这个例子中,我们从一个函数开始,该函数获取一个参数并将它与 1 到 100 间的随机数进行比较,返回一个表示结果的字符串。

扩展函数
在 XSLT 样式表中,扩展函数实际扩展 XPath,因此,您可以像使用内置函数(如 translate()round())一样使用它们。

调用函数 <table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1> <tr> <td>


...

  

      

  

  

      Guesser: 

      

  

  

        Guess: 

          Actual: 

  

</td></tr></table>

本示例将当前节点(guess)的字符串值传递给 getResult() 函数。名称空间让处理器知道触发结果组件中的函数。

图 1. 初步结果

使用元素
扩展元素比函数要复杂一点。我们不希望扩展元素简单地返回一个值(虽然它们可以这样做),而希望它们在样式表处理过程中的特定“时刻”执行某个特定的操作。也不希望获得一个随机的参数列表(因为扩展函数也可以),扩展元素背后的代码含有两个良好定义的参数。

rules 元素触发 rules() 函数的处理。该函数将 rules 元素本身(elem)作为其参数之一,允许您检索它拥有的任何定制属性的值。

使用处理器上下文
扩展元素最强大的方面可能是通过 XSL 处理器上下文参数访问源文档本身的能力。

处理器上下文 <table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1> <tr> <td>


...

  

    

...

      function rules(ctx, elem) {

       ctxNode = ctx.getContextNode();

          gameID = ctxNode.getFirstChild().getAttribute("gameID");

          return "Contest "+gameID+" is based on "+

                    elem.getAttribute("guessType")+" guesses.";

      }

    

  

...
</td></tr></table>

rules 函数的第一个参数是 org.apache.xalan.extensions.XSLProcessorContext 对象形式的处理器上下文。这允许您检索代表上下文节点、整个源树、样式表以及当前执行转换的转换程序的对象。访问上下文节点是最常见的。一旦由 getContextNode() 方法返回,这就是一个可以使用典型 DOM 操作的典型 XML 节点。

图 2. 最终输出

参考资料

<table cellSpacing=0 cellPadding=0 width="100%" border=0> <tr> <td>关于作者
Nicholas Chase 曾参与为包括 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers 在内的多家公司的网站开发。Nick 曾是一名高中物理教师、低级放射性废物设施管理员、在线科幻小说杂志编辑、多媒体工程师和 Oracle 讲师。最近,他成为佛罗里达州克利尔沃特市 Site Dynamics Interactive Communications 的首席技术官。他写了三本有关 Web 开发的书,包括 Java and XML From Scratch(Que)和即将出版的 Primer Plus XML Programming(Sams)。他乐于倾听读者的意见,可以通过 nicholas@nicholaschase.com 和他联系。</td></tr></table>

</textarea>
↑返回目录
前一篇: To JavaScript Prompts for Buttons in Asp::DataGrid for Delete Column(ZT)
后一篇: 常用JAVASCRIPT脚本