分享
 
 
 

用Java增加一个XSLT功能

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

开发XSLT解决方案可以很简单,只需要少量的工作执行转换。但是,有时候源文档和目标文档是比较复杂的,不同的。很多这种情况下,复杂的转换是通过等价的XSLT复杂转换实现的。

有些转换使用普通的XSLT功能是没法做到的。这种情况下,你可以使用Apache Xalan XSLT引擎和自定义的Java扩展在你的样式表里加入新函数。

一个例子

让我们从测试一个简单的例子开始吧。假设你正在转换一个XML文档,你需要在转换过程中执行很多高级的操作。你也许需要参考历遍一个数据库中的表或者访问一个Web服务。这些函数很简单,但是XSLT没有直接提供。

我们假设:有了一个简单的定购XML文档,如清单1所示。那么问题是:我们的转换过程需要翻转Description元素中的字符。也许,它不符合现实世界中的情况,但是它可以演示了。

清单1:order.xml

〈Order〉

〈Items〉

〈Item〉

〈SKU〉19723〈/SKU〉

〈Description〉Mechawidget Flange〈/Description〉

〈/Item〉

〈Item〉

〈SKU〉87123〈/SKU〉

〈Description〉Hydrafluant Magnet〈/Description〉

〈/Item〉

〈Item〉

〈SKU〉662354〈/SKU〉

〈Description〉Generic Rubber Seal〈/Description〉

〈/Item〉

〈Item〉

〈SKU〉967623〈/SKU〉

〈Description〉Fluxating Plasmatron〈/Description〉

〈/Item〉

〈/Items〉

〈/Order〉

解决方法

我们的解决方法是使用Apache Xalan XSL 处理器,并从它扩展出一个Java类。这个Java组件实现字符串数据的转换工作。XSL样式表访问这个Java类,把XML数据传进去,在XML结果文档中显示返回值。每一步都列在下面了。

Java部分

为了解决这个问题,我们首先需要写一个完成这个工作的Java代码。既然这样,我们将使用一个简单的字符串翻转类,如清单2所示:

清单2:Reverse.java

public class Reverse {

public static String reverse(String str) {

String retval = "";

char[] b = new char[str.length()];

str.getChars(0, str.length(), b, 0);

for (int i = (b.length - 1); i 〉= 0; i--) {

retval += b[i];

}

return retval;

}

}

这个类只有一个静态方法:reverse。这个方法的有一个String参数,返回一个字符串。这个函数将翻转字符串:从String类从读取字符到一个字符数组,然后从数组的尾部历遍字符。

XSLT部分

为了在XSL样式表中使用Java类,你需要声明一个XML命名空间。这个命名空间会识别调用Java类的格式。这里有3个不同的命名空间的格式供你使用:我们演示其中一个,Java格式如下:

xmlns:java=http://xml.apache.org/xalan/java

除了要声明java命名空间外,我们还需要设置〈xsl:stylesheet〉 元素的exclude-result-prefixes属性。这个属性会避免Java命名空间出现在输出文档里。

为了在XSL样式表里正确地调用Java组件,你需要指定类,方法和传入的参数。类必须以命名空间为前缀。比如,调用我们Reverse类的reverse()方法,就要这样做:

〈xsl:value-of select="java:Reverse.reverse(′This is a test′)" /〉

传入的值可以是一个静态的值(同上)或XML文档里的值。清单3列出了我们的XSL样式表,它包含了命名空间的声明,exclude-result-prefixes属性和〈Description〉元素的值:调用reverse()方法。

清单3:order.xsl

〈?xml version="1.0"?〉

〈xsl:stylesheet

version="1.0"

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

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

exclude-result-prefixes="java"〉

〈xsl:output method="xml"/〉

〈xsl:template match="/Order"〉

〈NeWorder〉

〈xsl:apply-templates/〉

〈/NewOrder〉

〈/xsl:template〉

〈xsl:template match="Items/Item"〉

〈Item〉

〈SKU〉〈xsl:value-of select="./SKU" /〉〈/SKU〉

〈Description〉〈xsl:value-of select="java:Reverse.reverse(./Description)" /〉

〈/Description〉

〈/Item〉

〈/xsl:template〉

〈/xsl:stylesheet〉

可重用组件

在样式表里使用Java类的部分价值是答应你重用Java组件。举例说,假如你有了一个业务逻辑或者访问数据仓库或企业应用的信息的类,那么在你的XSL应用中的重用就很强大了。同样,你可以重用为其他企业应用的XSL创建的Java扩展。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有