分享
 
 
 

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

王朝html/css/js·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

从 XSLT 样式表调用 JavaScript (转载 作者Nicholas Chase )http://www-900.ibm.com/developerWorks/cn/xml/tips/x-tipxsltjs/index.shtml样本文档

<?xml version="1.0"?>

<entries gameID="DWO">

<entry>

<player>John</player>

<guess>3</guess>

<guess>9</guess>

<guess>222</guess>

</entry>

<entry>

<player>Mary</player>

<guess>88</guess>

<guess>76</guess>

<guess>5</guess>

</entry>

</entries>

创建组件

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

基本样式表

<?xml version="1.0"?>

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

xmlns:lxslt="http://xml.apache.org/xslt"

xmlns:result="http://www.example.com/results"

extension-element-prefixes="result"

version="1.0">

<lxslt:component prefix="result" elements="rules" functions="getResult">

<lxslt:script lang="javascript">

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+".";

}

}

</lxslt:script>

</lxslt:component>

<xsl:template match="/">

<xsl:apply-templates/>

</xsl:template>

</xsl:stylesheet>

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

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

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

扩展函数

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

调用函数

...

<xsl:template match="/">

<xsl:apply-templates/>

</xsl:template>

<xsl:template match="entry">

Guesser: <xsl:value-of select="player"/>

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

</xsl:template>

<xsl:template match="guess">

Guess: <xsl:value-of select="."/>

Actual: <xsl:value-of select="result:getResult(string(.))"/>

</xsl:template>

</xsl:stylesheet>

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

图 1. 初步结果

使用元素

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

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

使用处理器上下文

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

处理器上下文

...

<lxslt:component prefix="result" elements="rules" functions="getResult">

<lxslt:script lang="javascript">

...

function rules(ctx, elem) {

ctxNode = ctx.getContextNode();

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

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

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

}

</lxslt:script>

</lxslt:component>

...

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

图 2. 最终输出

参考资料

请参考 W3C 的 XSLT 建议书

下载 Apache 的 Xalan-Java 2

下载 js.jar 文件。

developerWorks XML 专区上找到更多 XML 参考资料。

IBM WebSphere Studio Application Developer 是一个易于使用的集成开发环境,用于构建、测试并部署 Java Server Pages、servlet 和与 XML 相关的应用程序及网站。

关于作者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 和他联系。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有