XML和XSLT实现代码生成器(II)
XSLT处理元数据
如前文所述,当建立元数据以后,就可以使用XSLT将XML数据转换为实际的代码了,列表1.3展示了一个XSL文档,它将处理上述的XML元数据,完成转换工作。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!—Java代码是文本格式的,所以需要设定输出方法为testà
<xsl:output method="text"/>
<xsl:variable name="properties" select="/xgen/javabean/property"/>
<xsl:template match="/">
<xsl:apply-templates select="xgen"/>
</xsl:template>
<!—匹配xgen元素 à
<xsl:template match="xgen">
<xsl:text>/*Generated By XGen Xingchen Chu@XS Group Copyright(c) Reserved*/</xsl:text>
<xsl:apply-templates select="javabean"/>
</xsl:template>
<!—匹配javabean元素,实际代码生成在此完成à
<xsl:template match="javabean">
<xsl:text>package </xsl:text> <!—输出包名à
<xsl:value-of select="package/name"/>
<xsl:text>;</xsl:text>
<xsl:text>public class </xsl:text> <!—输出JavaBean类名 à
<xsl:value-of select="name"/>
<xsl:text> implements </xsl:text> <!—输出实现的接口à
<xsl:if test="implement">
<xsl:apply-templates select="implement"/>
</xsl:if>
<xsl:text>java.io.Serializable</xsl:text> <!—每个JavaBean必须实现的接口à
<xsl:text>{</xsl:text>
<xsl:call-template name="printField"/> <!—输出字段信息—>
<xsl:call-template name="printConstructor"/> <!—输出构造函数à
<xsl:apply-templates select="property"/> <!—输出所有属性的get和set方法à
<xsl:text>}</xsl:text>
</xsl:template>
<!—匹配implement元素,简单的输出其值并跟逗号à
<xsl:template match="implement">
<xsl:value-of select="text()"/><xsl:text>,</xsl:text>
</xsl:template>
<!—匹配property元素,输出适当的方法à
<xsl:template match="property">
<xsl:if test="@set='yes'">
<xsl:call-template name="printSetMethod">
<xsl:with-param name="property" select="."/>
</xsl:call-template>
</xsl:if>
<xsl:if test="@get='yes'">
<xsl:call-template name="printGetMethod">
<xsl:with-param name="property" select="."/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="printField">
<xsl:for-each select="$properties">
<xsl:text>private </xsl:text>
<xsl:value-of select="@type"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>=</xsl:text>
<xsl:call-template name="printDefaultValue"> <!—输出字段缺省值à
<xsl:with-param name="type" select="@type"/>
</xsl:call-template>
<xsl:text>;</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name="printConstructor">
<xsl:text>public </xsl:text>
<xsl:value-of select="/xgen/javabean/name"/>
<xsl:text>(</xsl:text>
<xsl:for-each select="$properties"> <!—输出构造函数参数列à
<xsl:value-of select="@type"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
<xsl:if test="position()<last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>){</xsl:text>
<xsl:for-each select="$properties"> <!—输出构造函数主体à
<xsl:text>this.</xsl:text>
<xsl:value-of select="name"/><xsl:text>=</xsl:text>
<xsl:value-of select="name"/><xsl:text>;</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>
列表1.3