kooyee ‘s blog

          開源軟件, 眾人努力的結(jié)晶, 全人類的共同財(cái)富
          posts - 103, comments - 55, trackbacks - 0, articles - 66
             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [JAVA] 使用xsl來動態(tài)生成java代碼

          Posted on 2007-12-08 19:54 kooyee 閱讀(556) 評論(1)  編輯  收藏 所屬分類: Java
          xsl本身就是一個(gè)構(gòu)型良好的xml,它能夠把一個(gè)xml文檔轉(zhuǎn)換成另外一個(gè)xml文檔,或者轉(zhuǎn)換成文本文件、html文件等等。這里就是利用xsl來動態(tài)的生成我們想要的java文件(從某種角度看,java代碼其實(shí)也就是一個(gè)文本文件),希望能夠通過這篇文章,看到xml以及相關(guān)的技術(shù)所具有的強(qiáng)大能力!

          這里首先給一個(gè)xml例子,我們將通過一個(gè)xsl從該xml文件中抽取有用的信息來生成java代碼(實(shí)際上是一個(gè)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]

          下面我就直接給出轉(zhuǎn)換的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">

          <!--這里就是指定通過這個(gè)xsl所轉(zhuǎn)換的結(jié)果的類型,是text格式-->
          <xsl:output method = "text"/>

          <!--xslt使用模版來處理xml中的節(jié)點(diǎn)-->
          <xsl:template match="bean">

          /**
          <xsl:value-of select="comments"/>//這里是獲取xml文檔中的節(jié)點(diǎn)值
          * 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>//輸出文本,這里是輸出一個(gè)空格
              
          <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中,輸入如下的命令行,就可以獲得我們想要的結(jié)果了:

          java org.apache.xalan.xslt.Process -in xmlSource  -xsl stylesheet -out outputfile

          這里列出結(jié)果:
          [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]

          總結(jié):
          1. 在熟悉了xsl的基本使用之后,理解以上的內(nèi)容并不是困難;
          2. 這樣做是比較適合預(yù)先知道了某些邏輯功能,但由于某種原因,需要動態(tài)生成,或者是為了節(jié)省不必要的重復(fù)工作,可以通過它自動生成代碼;
          3. 修改這個(gè)xsl比較方便。

          評論

          # re: [JAVA] 使用xsl來動態(tài)生成java代碼  回復(fù)  更多評論   

          2010-08-23 15:10 by cosplay
          在熟悉了xsl的基本使用之后,理解以上的內(nèi)容并不是困難;
          2. 這樣做是比較適合預(yù)先知道了某些邏輯功能,但由于某種原因,需要動態(tài)生成,或者是為了節(jié)省不必要的重復(fù)工作,可以通過它自動生成代碼;
          3. 修改這個(gè)xsl比較方便
          主站蜘蛛池模板: 蒲城县| 宁波市| 青铜峡市| 昌宁县| 吉安市| 额敏县| 拉孜县| 香河县| 苗栗市| 新化县| 阿城市| 枞阳县| 吉林省| 山阳县| 澜沧| 安国市| 通辽市| 开鲁县| 伊通| 桓仁| 德庆县| 紫金县| 揭西县| 思南县| 辉县市| 祁门县| 同心县| 永新县| 广灵县| 绥阳县| 朝阳县| 哈密市| 休宁县| 玛沁县| 无棣县| 涞源县| 扎赉特旗| 潍坊市| 封开县| 简阳市| 勃利县|