kooyee ‘s blog
开源软件, 众人努力的结晶, 全人类的共同财富
posts - 103, comments - 55, trackbacks - 0, articles - 66
::
首页
::
新随笔
::
联系
::
聚合
::
管理
[JAVA] 使用xsl来动态生成java代码
Posted on 2007-12-08 19:54
kooyee
阅读(536)
评论(1)
编辑
收藏
所属分类:
Java
xsl本身就是一个构型良好的xml,它能够把一个xml文档转换成另外一个xml文档,或者转换成文本文件、html文件等等。这里就是利用xsl来动态的生成我们想要的java文件(从某种角度看,java代码其实也就是一个文本文件),希望能够通过这篇文章,看到xml以及相关的技术所具有的强大能力!
这里首先给一个xml例子,我们将通过一个xsl从该xml文件中抽取有用的信息来生成java代码(实际上是一个javabean):
[code]
<?
xml version="1.0" encoding="ISO-8859-1"
?>
<
bean
>
<
name
>
Product
</
name
>
<
comments
>
This bean represents a product that the company
offers to its customers
</
comments
>
<
property
>
<
name
>
code
</
name
>
<
type
>
int
</
type
>
<
comments
>
the product inventory code
</
comments
>
</
property
>
<
property
>
<
name
>
name
</
name
>
<
type
>
String
</
type
>
<
comments
>
the product name
</
comments
>
</
property
>
<
property
>
<
name
>
testedOnAnimals
</
name
>
<
type
>
boolean
</
type
>
<
comments
>
the flag that indicates if the product was
tested on animals
</
comments
>
</
property
>
<
property
>
<
name
>
availableSince
</
name
>
<
type
>
java.util.Date
</
type
>
<
comments
>
the date when the company started offering this
product to its customers
</
comments
>
</
property
>
</
bean
>
[/code]
下面我就直接给出转换的xsl,如果大家对xsl不是很了解的话,可以先看一些资料,了解之后就会明白了。我在里面稍微做了些注释:
[code]
<?
xml version="1.0"
?>
<
xsl:stylesheet
xmlns:xsl
="http://www.w3.org/1999/XSL/Transform"
version
="1.0"
xmlns:java
="http://xml.apache.org/xslt/java"
exclude-result-prefixes
="java"
>
<!--
这里就是指定通过这个xsl所转换的结果的类型,是text格式
-->
<
xsl:output
method
= "text"
/>
<!--
xslt使用模版来处理xml中的节点
-->
<
xsl:template
match
="bean"
>
/**
*
<
xsl:value-of
select
="comments"
/>
//这里是获取xml文档中的节点值
* This class has been generated by the XSLT processor from the
metadata
*/
public class
<
xsl:value-of
select
="name"
/>
{
/**
* Creates a new instance of the
<
xsl:value-of
select
="name"
/>
bean
*/
public
<
xsl:value-of
select
="name"
/>
() {}
<
xsl:apply-templates
select
="property"
/>
}
</
xsl:template
>
<
xsl:template
match
="property"
>
private
<
xsl:value-of
select
="type"
/>
<
xsl:text
>
</
xsl:text
>
//输出文本,这里是输出一个空格
<
xsl:value-of
select
="name"
/>
;
<
xsl:variable
name
="name"
select
="name"
/>
//定义xsl中要使用的变量
<
xsl:variable
name
="cname"
select
="java:Capitalizer.capitalize($name)"
/>
//这里使用了xslt extensions,它可以允许在xslt中直接引用java中方法,非常方便。
/**
* Sets
<
xsl:value-of
select
="comments"
/>
* @param
<
xsl:value-of
select
="name"
/>
is
<
xsl:value-of
select
="comments"
/>
*/
public void set
<
xsl:value-of
select
="$cname"
/>
(
<
xsl:value-
of select
="type"
/>
<
xsl:text
>
</
xsl:text
><
xsl:value-
of select
="name"
/>
) {
this.
<
xsl:value-of
select
="name"
/>
=
<
xsl:value-of
select
="name"
/>
;
}
/**
* Returns
<
xsl:value-of
select
="comments"
/>
* @return
<
xsl:value-of
select
="comments"
/>
*/
public
<
xsl:value-of
select
="type"
/><
xsl:text
></
xsl:text
>
<
xsl:apply-templates
select
="type"
/><
xsl:value-of
select
="$cname"
/>
() {
return
<
xsl:value-of
select
="name"
/>
;
}
</
xsl:template
>
<
xsl:template
match
="type"
>
<
xsl:variable
name
="type"
select
="."
/>
<
xsl:choose
>
<
xsl:when
test
="$type='boolean'"
>
is
</
xsl:when
>
<
xsl:otherwise
>
get
</
xsl:otherwise
>
</
xsl:choose
>
</
xsl:template
>
</
xsl:stylesheet
>
[/code]
好了,完成以上工作之后,只要在cmd中,输入如下的命令行,就可以获得我们想要的结果了:
java org.apache.xalan.xslt.Process -in xmlSource -xsl stylesheet -out outputfile
这里列出结果:
[code]
/** */
/**
* This bean represents a product that the company offers to its
customers
* This class has been generated by the XSLT processor from the
metadata
*/
public
class
Product
{
/** */
/**
* Creates a new instance of the Product bean
*/
public
Product()
{}
private
int
code;
/** */
/**
* Sets the product inventory code
*
@param
code is the product inventory code
*/
public
void
setCode(
int
code)
{
this
.code
=
code;
}
/** */
/**
* Returns the product inventory code
*
@return
the product inventory code
*/
public
int
getCode()
{
return
code;
}
private
String name;
/** */
/**
* Sets the product name
*
@param
name is the product name
*/
public
void
setName(String name)
{
this
.name
=
name;
}
/** */
/**
* Returns the product name
*
@return
the product name
*/
public
String getName()
{
return
name;
}
private
boolean
testedOnAnimals;
/** */
/**
* Sets the flag that indicates if the product was tested on animals
*
@param
testedOnAnimals is the flag that indicates if the product
was tested on animals
*/
public
void
setTestedOnAnimals(
boolean
testedOnAnimals)
{
this
.testedOnAnimals
=
testedOnAnimals;
}
/** */
/**
* Returns the flag that indicates if the product was tested on
animals
*
@return
the flag that indicates if the product was tested on
animals
*/
public
boolean
isTestedOnAnimals()
{
return
testedOnAnimals;
}
private
java.util.Date availableSince;
/** */
/**
* Sets the date when the company started offering this product to
its customers
*
@param
availableSince is the date when the company started
offering this product to its customers
*/
public
void
setAvailableSince(java.util.Date availableSince)
{
this
.availableSince
=
availableSince;
}
/** */
/**
* Returns the date when the company started offering this product
to its customers
*
@return
the date when the company started offering this product
to its customers
*/
public
java.util.Date getAvailableSince()
{
return
availableSince;
}
}
[
/
code]
总结:
1. 在熟悉了xsl的基本使用之后,理解以上的内容并不是困难;
2. 这样做是比较适合预先知道了某些逻辑功能,但由于某种原因,需要动态生成,或者是为了节省不必要的重复工作,可以通过它自动生成代码;
3. 修改这个xsl比较方便。
评论
#
re: [JAVA] 使用xsl来动态生成java代码
回复
更多评论
2010-08-23 15:10 by
cosplay
在熟悉了xsl的基本使用之后,理解以上的内容并不是困难;
2. 这样做是比较适合预先知道了某些逻辑功能,但由于某种原因,需要动态生成,或者是为了节省不必要的重复工作,可以通过它自动生成代码;
3. 修改这个xsl比较方便
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
『Java』 用 Javac 编译时的问题
Java程序员必看--扩展鼠标右键菜单功能
【Java】Java程序员必须了解的开源协议 转
【Java】java.lang.NoSuchFieldError: counts
『Java』java.lang.UnsupportedOperationException at java.util.AbstractLis
[Data Structure] Vector 和 ArrayList的不同
[JAVA] 使用xsl来动态生成java代码
[Java]代码动态生成利器ASM 转
[WEB] MetaData Programme
【Java】properties的使用
Powered by:
BlogJava
Copyright © kooyee
日历
<
2007年12月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
公告
一起畅游计算机的世界
常用链接
我的随笔
我的文章
我的评论
我的参与
最新评论
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
AI 人工智能(1)
Ajax学习手记(2)
C/C++(1)
Database数据库技术(4)
Groovy on Grails(1)
GUI骨衣 (6)
J2EE(1)
Jasper Report (2)
Java (15)
Lniux/Unix (14)
Regular Expression正则表达式
Software(1)
Software Engineering 软件工程(2)
Swing/Applet(19)
Web Design网页设计 (4)
Web Framework 网络框架(1)
Windows (2)
Wireless Ad-hoc and sensor network(4)
开源 OpenSource(1)
随笔档案
2009年1月 (1)
2008年12月 (3)
2008年11月 (3)
2008年10月 (2)
2008年7月 (2)
2008年6月 (22)
2008年5月 (3)
2008年4月 (2)
2008年3月 (10)
2008年2月 (14)
2008年1月 (5)
2007年12月 (6)
2007年11月 (5)
2007年10月 (5)
2007年9月 (2)
2007年8月 (17)
搜索
积分与排名
积分 - 161850
排名 - 365
最新评论
1. re: SUM, COUNT 等在 jasper report 中使用方法
<javascript language="java"> alert("aaaa")</javascript>
--sd
2. re: 【Bug】当调用nam时错误
怎么重装ns-2.33
--雨中蝶
3. re: [SWT] SWT table中select item以及添加其他control(checkbox, button)
如果要加的CheckBox很多的话,会不会速度很慢呢?
--问路
4. re: [JAVA] 使用xsl来动态生成java代码
评论内容较长,点击标题查看
--cosplay
5. re: 『Java』java.lang.UnsupportedOperationException at java.util.AbstractLis
api 的设计多此一举还搞个内部类
--冬天鸡鸡好冷
阅读排行榜
1. VB使用WebBrowser读取网页内容(12228)
2. 【Simulator】Cygwin下NS2安装和配置(3635)
3. 什么是*.ps文件(3576)
4. 『Java』java.lang.UnsupportedOperationException at java.util.AbstractLis(3547)
5. 【linux脚本】bad interpreter: No such file or directory(3370)