XML输出

如今XML 已经成为许多设备和协议的标准格式,如RSS和SVG。使用ZK输出XML 是很直接的。

使用ZUML页面输出产生XML 输出的三步

  1. 使用XML组件集( http://www.zkoss.org/2007/xml )。

  2. 将文件扩展映射到ZK加载器。

  3. 将文件扩展映射到XML组件集。

使用XML组件集, http://www.zkoss.org/2007/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>

此处

  1. 内容类型(content type)由page指令指定。对于 SVG,为image/svg+xml。输出的xml处理指令(<?xml?>)和DOCTYPE也是由page指令指定的。更多关于page指令的信息请参考Developer's Reference。 

  2. 此例中所有的标签,例如svgcircle,都与命名空间( http://www.w3.org/2000/svg )关联,而ZK加载器并不知道此命名空间。因此,它们被假定属于本地命名空间。它们会被直接输出,而不会为它们创建ZK组件。关于更多关于本地命名空间的信息请参考ZUML及XUL组件集(ZUML with the XUL Component Set)一章中关于本地命名空间(Native Namespace)的部分。 

  3. 为使用zscriptforEach和其它ZK特性,你必须要指定ZK命名空间( http://www.zkoss.org/2005/zk )。

将文件扩展映射到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组件集

除非文件扩展名为.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标签并输出,XML组件集提供了几个组件用以简化复杂的任务,如XSLT。

The XML Transformer

为将一个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>



[61] 说到未知标签,我们指未与命名空间相关联,或命名空间未知。

[62] 我们假定ZK加载器(zkLoader) 被映射到org.zkoss.zk.ui.http.DHtmlLayoutServlet。