使用xsl来动态生成java代码

动态

xsl本身就是一个构型良好的xml,它能够把一个xml文档转换成另外一个xml文档,或者转换成文本文件、html文件等等。这里就是利用xsl来动态的生成我们想要的java文件(从某种角度看,java代码其实也就是一个文本文件),希望能够通过这篇文章,看到xml以及相关的技术所具有的强大能力!

这里首先给一个xml例子,我们将通过一个xsl从该xml文件中抽取有用的信息来生成java代码(实际上是一个javabean):
以下内容为程序代码
<?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>

下面我就直接给出转换的xsl,如果大家对xsl不是很了解的话,可以先看一些资料,了解之后就会明白了。我在里面稍微做了些注释:
以下内容为程序代码
<?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>

好了,完成以上工作之后,只要在cmd中,输入如下的命令行,就可以获得我们想要的结果了:
java org.apache.xalan.xslt.Process -in xmlSource  -xsl stylesheet -out outputfile

这里列出结果:
以下内容为程序代码
/**
* 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;
    }

}

总结:
1. 在熟悉了xsl的基本使用之后,理解以上的内容并不是困难;
2. 这样做是比较适合预先知道了某些逻辑功能,但由于某种原因,需要动态生成,或者是为了节省不必要的重复工作,可以通过它自动生成代码;
3. 修改这个xsl比较方便。

sjoy

时间: 2024-10-29 01:22:12

使用xsl来动态生成java代码的相关文章

使用ant工具生成java代码时build failed,总是提示找不到第二张图的东西

问题描述 使用ant工具生成java代码时build failed,总是提示找不到第二张图的东西

求一款自动生成java代码调用序列的eclipse插件

问题描述 求一款自动生成java代码调用序列的eclipse插件 我们知道java代码对于一个特定输入有一个调用序列,比如当前程序运行到A类,在A类中调用callB.b()进入B类,在B类中调用callC.c()进入C类等等. 有没有一款好的eclipse插件能够生成这种调用序列?

[MVC4+Razor]如何在页面文件内动态生成javascript代码??

问题描述 [MVC4+Razor]如何在页面文件内动态生成javascript代码??我的Model是个数据类的List,想对这个List中每个对象生成一段js代码.请问用什么方法输出实现??目前我在<script></script>用如下方法:@foreach(variteminModel){Response.Write("function@item.Name(){}");}后,运行生成一对代码,在页面最顶部,而且没在<script></sc

简化Ajax和Java开发,第1部分:用JSP标记文件动态生成JavaScript代码

很多Web开发人员都经常抱怨说 Java EE 太复杂.构建新的 Web 组件太难.定制现有的组件没有预想的那样简单,并且即便是很小的更改都需要重新启动应用程序.本系列给出了针对这些问题的解决方案,即采用代码生成器.约定.脚本语言和先进的 JavaServer Pages (JSP) 特性.在本文中,您将了解如何基于 JSP 标记文件构建可重用的 Ajax 和 Java 组件,而这些 JSP 标记文件很容易开发和部署.更改之后,JSP 标记文件会由 Java EE 服务器自动重编译,而无须重启应

求asn1消息格式生成java代码的工具

问题描述 想使用org.apache.harmony的jdk的asn1能力实现编解码,怎么将asn1消息格式生成对应的java代码呢?

用Lombok代码自动生成Java代码 节约开发时间

一.Lombok是什么 Lombok是一款小巧的代码生成工具.官方网址:http://projectlombok.org/ LomBok主要特性有:自动生成默认的getter/setter方法.自动化的资源管理(通过@Cleanup注解)及注解驱动的异常处理等.目前在国外广泛应用. LomBok它和jquery一样,目标是让程序员写更少的代码,以及改进一些原始语法中不尽人意的地方.Lombok能做到这一点.既不是用 annotations process,也不是用反射.而是直接黑到了编译过程中.

php动态生成JavaScript代码_php技巧

复制代码 代码如下: <?php echo <<<JS //使用多行输出的方法输出JavaScript代码 <SCRIPT Language = "JavaScript"> function func() { if(confirm("Are you OK with this?")) { document.write("I'm OK!"); } else { document.write("I'm no

PowerDesigner规划数据库&amp;HibernateTools逆向生成java代码

这部分内容对我来说是新知识PowerDesigner16.5大概700M,下载安装并破解.创建一个model并将DBMS选择为mysql自己规划数据库数据表如下图示例默认PowerDesigner没有comment这个列需要自己手动添加按ctr+U唤出如下图所示窗口,添加comment列然后将下面的代码copy到上面的窗体,运行 Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the curre

php动态生成饼图代码

*/ //创建图像 $image=imagecreatetruecolor(300,300); //定义画饼状图所需要的颜色 $white=imagecolorallocate($image, 0xff, 0xff, 0xff); $gray=imagecolorallocate($image, 0xc0, 0xc0, 0xc0); $darkgray=imagecolorallocate($image, 0x90, 0x90, 0x90); $navy=imagecolorallocate($