使用xsl來動態生成java代碼
發表時間:2023-08-20 來源:明輝站整理相關軟件相關文章人氣:
[摘要]xsl本身就是一個構型良好的xml,它能夠把一個xml文檔轉換成另外一個xml文檔,或者轉換成文本文件、html文件等等。這里就是利用xsl來動態的生成我們想要的java文件(從某種角度看,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