kooyee ‘s blog
開源軟件, 眾人努力的結晶, 全人類的共同財富
posts - 103, comments - 55, trackbacks - 0, articles - 66
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
[JAVA] 使用xsl來動態生成java代碼
Posted on 2007-12-08 19:54
kooyee
閱讀(558)
評論(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
日歷
<
2010年8月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
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
公告
一起暢游計算機的世界
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(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)
搜索
積分與排名
積分 - 163976
排名 - 363
最新評論
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讀取網頁內容(12255)
2.?【Simulator】Cygwin下NS2安裝和配置(3667)
3.?什么是*.ps文件(3608)
4.?『Java』java.lang.UnsupportedOperationException at java.util.AbstractLis(3558)
5.?【linux腳本】bad interpreter: No such file or directory(3388)
主站蜘蛛池模板:
亚洲综合国产成人丁香五月激情
|
亚洲神级电影国语版
|
精品乱子伦一区二区三区高清免费播放
|
亚洲人成网站免费播放
|
亚洲另类自拍丝袜第1页
|
亚洲免费人成视频观看
|
在线观看免费毛片
|
亚洲人成网站在线在线观看
|
欧洲乱码伦视频免费国产
|
国产黄在线播放免费观看
|
亚洲黄黄黄网站在线观看
|
xvideos永久免费入口
|
亚洲性猛交XXXX
|
无码中文字幕av免费放dvd
|
亚洲视频一区在线
|
成人a免费α片在线视频网站
|
国产精品亚洲专区无码WEB
|
91福利免费视频
|
国产亚洲日韩在线三区
|
暖暖免费日本在线中文
|
免费一看一级毛片人
|
亚洲av一本岛在线播放
|
四虎影院免费在线播放
|
免费在线观看一区
|
久久久久久a亚洲欧洲aⅴ
|
亚洲成人免费网站
|
亚洲AV无码XXX麻豆艾秋
|
免费电影在线观看网站
|
高h视频在线免费观看
|
99久久精品日本一区二区免费
|
亚洲精品国产精品乱码不卡√
|
久久w5ww成w人免费
|
亚洲AV日韩AV一区二区三曲
|
亚洲精品乱码久久久久久蜜桃不卡
|
男女污污污超污视频免费在线看
|
亚洲中文字幕无码不卡电影
|
9420免费高清在线视频
|
国产精品无码亚洲一区二区三区
|
亚洲人成色777777在线观看
|
国产在线观看麻豆91精品免费
|
毛片亚洲AV无码精品国产午夜
|