如今XML 已经成为许多设备和协议的标准格式,如RSS和SVG。使用ZK输出XML 是很直接的。
使用XML组件集(
http://www.zkoss.org/2007/xml
)。
将文件扩展映射到ZK加载器。
将文件扩展映射到XML组件集。
XML组件集(亦=XML语言,在ZK术语中)被用于产生XML输出。不同于XUL或XHTML组件集,所有在ZUML页面内未知的[61] 标签都被假定属于本地命名空间(http://www.zkoss.org/2005/native
),而不是抛出一个异常。ZK会直接产生它们并输出,而不会为它们创建ZK组件(instantiating a ZK component for each of them)。
下面为一个产生SVG输出的例子。这看起来和你想产生的XML输出非常相似,除了(except)你可以使用EL表达式,宏组件和其它ZK特性。
<?page contentType="image/svg+xml;charset=UTF-8"?> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:z="http://www.zkoss.org/2005/zk"> <z:zscript><![CDATA[ String[] bgnds = {"purple", "blue", "yellow"}; int[] rads = {30, 25, 20}; ]]></z:zscript> <circle style="fill:${each}" z:forEach="${bgnds}" cx="${50+rads[forEachStatus.index]}" cy="${20+rads[forEachStatus.index]}" r="${rads[forEachStatus.index]}"/> </svg>
产生的输出将会为
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" version="1.1"> <circle style="fill:purple" cx="80" cy="50" r="30"> </circle> <circle style="fill:blue" cx="75" cy="45" r="25"> </circle> <circle style="fill:yellow" cx="70" cy="40" r="20"> </circle> </svg>
此处
内容类型(content type)由page
指令指定。对于 SVG,为image/svg+xml
。输出的xml
处理指令(<?xml?>)和DOCTYPE
也是由page
指令指定的。更多关于page
指令的信息请参考Developer's Reference。
此例中所有的标签,例如svg
和circle
,都与命名空间(
http://www.w3.org/2000/svg
)关联,而ZK加载器并不知道此命名空间。因此,它们被假定属于本地命名空间。它们会被直接输出,而不会为它们创建ZK组件。关于更多关于本地命名空间的信息请参考ZUML及XUL组件集(ZUML with the XUL Component Set)一章中关于本地命名空间(Native Namespace)的部分。
为使用zscript
,forEach
和其它ZK特性,你必须要指定ZK命名空间(
http://www.zkoss.org/2005/zk
)。
为让ZK加载器处理文件,你需要在WEB-INF/web.xml
内将其与ZK加载器相关联。在此例中,我们将所有的.svg
扩展文件映射到ZK加载器[62]:
<servlet-mapping> <servlet-name>zkLoader</servlet-name> <url-pattern>*.svg</url-pattern> </servlet-mapping>
除非文件扩展名为.xml
,否则你必须在WEB-INF/zk.xml
内明确的将其与XML组件集(亦=XML语言)相关联。在这个例子中,我们将.svg
映射到XML组件集:
<language-mapping> <language-name>xml</language-name> <extension>svg</extension> </language-mapping>
此处,xml
为XML组件集(
http://www.zkoss.org/2007/xml
)的名称。因此,当ZK加载器解析一个.svg
文件时,它就知道了默认的语言为XML组件集。
除了直接产生XML标签并输出,XML组件集提供了几个组件用以简化复杂的任务,如XSLT。
为将一个XML 文件翻译为另外一个,你可以使用transformer
组件,如下。
<?page contentType="text/html;charset=UTF-8"?> <x:transformer xsl="book.xsl" xmlns:x="http://www.zkoss.org/2007/xml"> <book> <title>ZK - Ajax without the JavaScript Framework</title> <for-who>Web application designers and programmers who wish to implement rich Ajax web applications in the simplest way.</for-who> <author>Henri Chen and Robbie Cheng</author> </book> </x:transformer>
此处, transformer 为XML组件集的一个组件,所以我们必须要指定命名空间。否则假定为本地命名空间。
那么,让我们假定book.xsl
的内容如下。
<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Book Info</title> </head> <body> <h1>Book Info</h1> <xsl:apply-templates select="book"/> </body> </html> </xsl:template> <xsl:template match="book"> <dl> <dt>Title:</dt> <dd><xsl:value-of select="title"/></dd> <dt>Who is this book for:</dt> <dd><xsl:value-of select="for-who"/></dd> <dt>Authors</dt> <dd><xsl:value-of select="author"/></dd> </dl> </xsl:template> </xsl:stylesheet>
那么,产生的XML 输出将会为XHTML ,如下。
<html> <head> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Book Info</title> </head> <body> <h1>Book Info</h1> <dl> <dt>Title:</dt> <dd> ZK - Ajax without the JavaScript Framework</dd> <dt>Who is this book for:</dt> <dd> Web application designers and programmers who wish to implement rich Ajax web applications in the simplest way.</dd> <dt>Authors</dt> <dd> Henri Chen and Robbie Cheng</dd> </dl> </body> </html>