`

xalan xslt自定义函数如何关联(java)

阅读更多

研究问题:xslt 转换可以实现扩展函数,在 java 中如何使自定义的函数与之关联!

 

1.  XSLT处理器

1.1.  XSLT处理器本身的扩展功能

目前较常用的XSLT 处理器有 Saxon (有 Java .NET 两种版本)、 Xalan (有 Java 和  C++ )两种版本 MSXML (可用于 Visual Basic C++ JScript 脚本等)、 .NET XSLT 处理器等。这些 XSLT 处理器都提供了各自的扩展功能。

说明:这些处理器的下载网址如 下:Saxon http://saxon.sourcefourge.net ); Xalan http: //xalan.apache.org ); MSXML .NET 可以从微软公司的 MSDN 网站( http://msdn.microsoft.com )下 载。

 

1.2.  EXSLT XSLT 扩展)

XSLT扩展技术中,比较有代表性的是 EXSLT Extensions to XSLT XSLT 扩展)。 EXSLT.org是一个以扩展 XSLT 为目的而发展起来的组织,其提出的 “EXSLT” 得到了 Saxon Xalan XSLT 处理器的支持。

EXSLT定义了多个模块( module ),如 Common (普通模块,提供常用的 XSLT 扩展功能)、  Math (数学运算)、 Sets (节点集操作)、 Functions (自定义函数或处理脚本)、 Dates and Times (日期和时间)、 Strings (字符串)、 Regular Expressions (正则表达式)、 Dynamic XPath 动态求值)、 Random (随机序列)等。 EXSLT 引入了新的元素或函数,扩展了  XSLT 1.0 的功能,详细请参见其网站( http://www.exslt.org )上的介绍。

注意:EXSLT 的模块并不是必须实现的。某些生成支持 EXSLT 的处理器仅实现其中部分的功能。

 

2.  saxon xalan 的研究

Saxon实现扩展功能需要收费。 Xalan apache 的一个项目。

这两种技术都能实现自定义函数的扩展,但是官方的帮助文档对开发人员来说基本上没有帮助。给出的demo 都是 jar 包,还要反编译才能看见 demo 的源码。看了一下例子后,算了,收费的啊,闪!

在研究xalan 的时候发现,原来是这么的容易,下面给出这里例子。

 

 

3.  解决问题

Dom4j使用的是 xalan xslt 处理器: Transforme 实现 org.apache.xalan.transformer.TransformerIdentityImpl

3.1.  如何将java 类链接到 xslt

静待调用

xalan 中实现扩展的时候, java 类的方法都是静态方法。用 java.lang.Math 做测试。

1. xml文件

<? xml   version = "1.0"   encoding = "UTF-8" ?>

< datas >

< data > 16 </ data >

< data > 9 </ data >

</ datas >

<data> 标签内的做平方根计算。这里平方根计算借助 java.lang.Math.sqrt() 方法实现。用 xalan xslt 调用一个 java 类的静态方法只需三步:

将一个名称空间前缀(如 math )映射为形如  xalan://fully.package.qualified.ClassName (如 xalan://java.lang.Math )的  Uniform Resource Identifier URL )。

在根元素 xsl:stylesheet  的  extension-element-prefixes  属性中列出此前缀。

使用 prefix : methodName() 这样的形式调用函数,例如  math:sqrt(.)

 

2. xml文件 :声明 xalan xslt 文件。这里声明版本 xslt1.0 不是 xslt2.0

< xsl:stylesheet   version = "1.0"

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

xmlns:math = "xalan://java.lang.Math"

extension-element-prefixes = "math" >

< xsl:template   match = "/" >

< xsl:for-each   select = "datas" >

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

</ xsl:for-each >

</ xsl:template >

 

< xsl:template   match = "data" >

< xsl:variable   name = "value"   select = "number(.)"   />

< xsl:value-of   select = "math:sqrt($value)" />

</ xsl:template >

</ xsl:stylesheet >

注意: 要调用其他类中的静态方法,可将完全限定名称映射到另外一个前缀。然后,在 extension-element-prefixes  属性中列出各前缀,以空格分隔。

     这种技术绝非仅限于核心 Java  包中定义的方法。您可通过完全相同的方式调用您自己的类中的静态方法;这些方法可以实现一个  Java  静态方法能实现的一切功能。只要在运行  Xalan  时将类放在您所使用的类路径中即可。

 

测试用的 SimpleTransform 类:

public   class   SimpleTransform {

   public   static   void  main(String[] args)  throws  TransformerException, TransformerConfigurationException, FileNotFoundException, IOException{

    TransformerFactory tFactory = TransformerFactory. newInstance ();

    Transformer transformer = tFactory.newTransformer( new  StreamSource( "2.xsl" ));

//  Result result = new StreamResult(new FileOutputStream("result.xml"));//结果输出到result.xml文件

    Result result =  new  StreamResult(System. out );  //结果输出到在控制台

    transformer.transform( new  StreamSource( "1.xml" ),result );

    System. out .println( "************* The result is in result.xml *************" );

  }

}

 

如果你很关心这项技术,可以查看: 简单的 Xalan 扩展函数

 

  • A_XSLT.rar (3.9 KB)
  • 描述: 本文相关代码,解压为一个eclipse工程
  • 下载次数: 54
1
0
分享到:
评论
3 楼 CapsLk 2010-12-27  
1 "用xalan中的方法,应该怎么引用呢?"
答:默认的函数方法,你可以查找相关的资料。声明在默认命名空间的,可以直接使用。
2 extension-element-prefixes = "Math,String"应该用空格分隔,我在文章中写得很清楚。eg.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="xalan://java.lang.Math"
xmlns:string="xalan://java.long.String"
extension-element-prefixes="math string">
2 楼 雨的印迹 2010-12-27  
你这个应该不是用到了xalan中的函数方法吧,那么如果要是用xalan中的方法,应该怎么引用呢?
<xsl:stylesheet version="1.0"

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

xmlns:xalan="http://xml.apache.org/xalan">


这个头信息是我在网上找到资料,他的引用我测试了一下,但是好像只能引用到xalan中的org/apache/xalan/lib/Extensions.java  这个类,其它类就不知道是怎么引用呢。
具体例子。
http://tech.ccidnet.com/art/3737/20040222/518327_1.html
1 楼 雨的印迹 2010-12-27  
你好,请教你一个问题。
< xsl:stylesheet   version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
xmlns:math = "xalan://java.lang.Math"
extension-element-prefixes = "math" >
这个地方你只是引用了Math类,
1.那么我想再引用String类的方法或者是更多的类,应该是怎么样的啊?
我试了一下写了两个extension-element-prefixes = "String"或者是extension-element-prefixes = "Math,String" 这样写好像是不行的,请教!
希望能给与解决,或者有更多的资料可以发给我的Email:caonan_soft@163.com
不胜感激!
如果楼下的有知道,也可以告诉小弟一下,谢谢!

相关推荐

    xslt中调用java

    Xalan支持创建自定义函数,这些函数可以在XSLT样式表中被调用,实际上它们是用Java编写的。使用`&lt;xsl:extension-element-prefix&gt;`和`&lt;xsl:call-template&gt;`或`&lt;xsl:function&gt;`声明Java方法,并在XSLT中调用。 示例...

    xalan_custom_xpath_sample:此示例演示如何使用 Xalan 开发自定义 Xpath

    - 示例XSLT样式表,其中使用了自定义函数。 - 测试脚本或程序,用于运行和验证示例。 通过研究和学习这个示例,你可以深入了解如何在实际项目中集成和使用自定义XPath函数,提高XML处理的灵活性和效率。 总结一下...

    xalan jar 2.7.2

    5. **可扩展性**:支持用户自定义的函数和扩展,可以创建自己的模板和函数库,以满足特定需求。 **使用Xalan-J 2.7.2** 在实际应用中,开发者通常会通过以下步骤使用Xalan-J: 1. **添加依赖**:将`xalan.jar`...

    XSLT使用的例子

    此外,XSLT 2.0及以上版本还支持自定义函数。 在“XsltExample”中,我们可能看到以下场景: - **数据格式化**:例如,将XML中的数值格式化为货币值,或者将日期字符串转换为人类可读的格式。 - **结构转换**:XML...

    xslt 扩展PDF教程

    - **编程语言**:使用如Java、C#等编程语言编写自定义扩展。 - **原生集成到XSLT处理器**:一些XSLT处理器如Saxon、Xalan等内置了对EXSLT的支持。 #### 4.2 实施挑战 实施扩展的主要挑战是**可移植性**。因为不同...

    xslt-blooms-test:只需使用 XSLT 文件中的所有 Java 对象,无需任何库。 (只是JDK)

    前者允许声明自定义的元素,这些元素在转换过程中被映射到Java类的方法,后者则支持自定义函数,这些函数同样可以在XSLT中调用。这样,我们就可以在XSLT模板中灵活地使用Java对象,进行复杂的逻辑处理或数据计算。 ...

    XSLT-Mastering.XML.Transformations

    除了标准的XSLT功能,开发者还可以通过自定义扩展元素和函数来扩展XSLT的能力。这使得XSLT能够适应更广泛的应用场景,如数据库访问、图形生成等。 ### 案例研究:Toot-O-Matic 书中的案例研究部分通过一个具体的...

    xalanjava源码-extensify:一套Java库,旨在使包含DataPowerXSLT扩展的单元测试XSLT转换成为可能

    xalan java源码扩大 概述 extensify 是一套 Java 库,旨在使包含自定义的单元测试 XSLT 转换成为可能。 诸如此类的平台利用了 XSLT 规范中的这一特性,并实现了超出标准 XSLT 甚至 . 虽然这些扩展提供了在 DataPower...

    XSLT(XML)

    Xalan 是一个流行的 XSLT 处理器,支持 Java 和 C++ 平台。安装 Xalan 的步骤通常包括: - **下载 Xalan**: 访问官方网站获取最新版本的 Xalan。 - **配置环境**:根据所使用的平台进行相应的环境配置。 - **测试...

    xalanjava源码-bestman2:伯克利存储管理器(BeStMan)

    5. **扩展机制**:Xalan-Java提供了一套强大的扩展机制,允许开发者自定义函数库、模版和处理行为,以满足特定需求。 接下来,我们转向伯克利存储管理器(BeStMan)。这是一个专门为分布式系统设计的高性能、可扩展...

    第15章-用Servlet与XSL结合开发WEB应用程序教学课件PPT文档.pptx

    7. **Apache Crimson与Apache Xalan**:早期的JAXP版本与Apache Crimson(源自Sun Project X Parser)捆绑,但随着JAXP的发展,如JAXP 1.2,开始采用Apache Xalan作为XSLT处理器,而不再直接支持Apache Crimson。...

    XqqUnit:XSLT和XML单元测试框架-开源

    2. **全面覆盖**:支持对XSLT脚本中的各个部分进行独立测试,包括模板、模式匹配、变量和函数等。 3. **断言机制**:提供丰富的断言库,如比较XML结构、文本内容、节点计数等,确保测试结果的准确性。 4. **集成友好...

    各大厂商护网面试题汇总

    可以使用自定义加密绕过静态分析,部分函数不会触发动态扫描(运行时分析)等方法来绕过Windows Defender的防御机制。 3. 卡巴斯基进程保护: 可以通过蓝屏获得memory.dmp绕过卡巴斯基,然后通过蓝屏绕过卡巴斯基...

    xml和xsl生成html页面

    在实际应用中,我们可以使用XML解析器(如Java的DOM或SAX解析器)读取XML文档,然后结合XSLT处理器(如Saxon或Xalan)和XSL样式表进行转换,生成HTML页面供浏览器展示。例如,`test.xml`可能是包含结构化数据的XML...

Global site tag (gtag.js) - Google Analytics