从 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. 最终输出
参考资料
分享到:
相关推荐
从 XSLT 样式表调用 JavaScript
XSL基础教程 从XSLT样式表调用 JavaScript XSLT 是什么类型的语言 XML认证教程,第 4 部分 XSL样式单
1)xslt控制xml样式 2)xml、xslt被html调用 3)xml、xslt被c#后台调用
本资料含有以下内容:xml基础 dtd约束模式 schema约束模式 xslt样式 sax解析 dom解析 jom解析
Web 服务标准的架构师刻意选择了使用 XML 表示 WSDL 文档,其中的部分原因是出于使它们能够为各种开发工具所解析和...本文将给出可用于采用 XSL 样式表对 WSDL 进行深入了解的方法,并说明了一些应该避免的常见错误。
javascript xml xsl xslt javascript xml xsl xslt javascript xml xsl xslt javascript xml xsl xslt
xslt中调用java
如何在XSLT样式表中声明命名空间
XSLT 调用 Java 的类方法XSLT 调用 Java 的类方法
用于将 OGC 服务响应(如 GetCapabilities)转换为人类可读格式的 XSLT 样式表 演示: 遵循 OGC 标准的地图服务通常被称为“自描述”。 这意味着他们使用 XML 格式的元数据来响应 GetCapabilities 请求。 此元...
使用xslt讲xml文件转换成html和js的形式,根据js处理不同的xml文件
主要介绍了将XSLT作为HTML的样式表的使用方法示例,文中所展示的代码在全文最后有提供下载的链接,需要的朋友可以参考下
Zero Server Controls technique in ASP.Net, C# (XML Insertion, JavaScript tricks using AJAX deletion and XSLT record display using JavaScript)
序列化-xml XSLT 样式表将 XML 序列化为文本或 HTML。
XML样本和XSLT样式表,用于从辅助来源记录笔记 sample.xml当前设置为使用notes.xsl作为默认样式表,从而生成一个以颜色编码HTML文档,但是可以使用mdnotes.xsl将文件转换为MarkDown文档。 有关使用示例,请参阅。 ...
用javascript以xslt显示xml_demo
主要实现的是XML与CSS、XML与XSL及在页面中直接调用XML的数据,原理很简单。
用XML XSLT CSS JavaScript模式组建网站
xslt手册.chm java实现xslt 简单的 Xalan 扩展函数 - 工程 xslt知识点速查手册.doc 2 Javascript XSLT 处理XML文件(IE and Firefox).doc Saxon 剖析 XSLT 处理器.doc