Table of Contents
概述
通过CustomReport的Xml格式定义,可以非常容易地将一个Datasource序列化后的Xml转换为xhtml或者其他格式。 但使用者必须了解其原理并深刻掌握各种元素以及文本模板的含义。
另外使用者应该掌握一些xslt的基本原理。
转换原理
首先进行序列化: Zgsoft.Datasource->DataTree--(序列化)->DataTree.Xml
第一次转换:DataTree.Xml->提取cusReportXml--(用zgCusReport.xslt转换)->[[中间的xslt]]
第二次转换:DataTree.Xml----([[中间xslt]]转换) ----->html
CusReport的XML元素介绍
<zxl:root>元素
- 说明:
-
根元素,也是整个xml文档的根元素,整个xml是从这个元素开始解析的,一般都用来生产<html>元素,以及<head><body>元素。
在实际的转换过程中,可以把<zxl:root>看成是<zxd:data>的对应。
- 格式:
-
<zxl:root xmlns:zxl="http://www.cpcsoft.com/data/xslt">
Important
必须在<zxl:root>元素中申明zxl的命名空间属性 xmlns:zxl="http://www.cpcsoft.com/data/xslt"。
- 示例:
-
<zxl:root xmlns:zxl="http://www.cpcsoft.com/data/xslt"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>客户端导航</title> </head> <body><zxl:var name=""/>
- 父元素
-
无
- 子元素
-
任何html元素或者cusReport元素。
<zxl:container>元素,表循环元素
- 说明:
-
为核心元素之一。表示对表的每一行进行转换,也就是说:转换的是<zxd:row>元素。若转换的Datasource支持分页,则会自动加上“当前页”的过滤条件。
- 格式:
-
<zxl:container table-id="tableName" filter="filterExp">
- 支持的属性(attribute)
-
atrribute 选项 说明 table-id 必选 限定当前的表式哪一个表,其值为表的表名称(Name)或者id filter 可选 对表中行的过滤条件,若引用字段的话用@fieldName,满足xpath的语法。 if 可选 在外层生成if条件,仅仅当条件满足后,才进行表循环调用。
- 父元素
-
<zxl:root>或者<zxl:container>,或者其他的html元素,比如table ,div等。
- 子元素
-
<zxl:container>,任何其他的html元素。
Important
<zxl:container>元素可以嵌套。当出现嵌套时,嵌套的层次结构和原来dataTree的层次必须一一对应, 不能跳跃级别到父亲或者孙子,只能为其直接子表。
- xslt当前节点node
-
为<zxd:row>元素,即表的相应的行元素。
- 示例:
-
<div style="100%;padding-top: 5px; padding-left: 5px;"> <zxl:container table-id="zgSysCliNavPage"> <!--每个组的循环--> <table style=" 100%; font-size:12px;"> <zxl:container table-id="zgSysCliNavPageItemGroup"> <!--分组标题--> <tr> <td style=" font-weight:bold; padding:5px 5px 5px 5px"> <zxl:text>[[@f_caption]] </zxl:text> </td> </tr>
在上例中,<xsl:container table-id=="zgSysCliNavPage">,在转换时, 会对表zgSysCliNavPage的每一行进行迭代,生成其 子元素的部分。
<zxl:text if="boolExpression"> 文本元素
- 说明:
-
用来生产一个元素的文本值,可以用属性模板[[]],也可以包含下级元素<zxl:const><zxl:value>。
Important
尽管可以直接给某个元素的文本写值,但只有<zxl:text>才能使用模板和变量,也就是说可以引用数据行中的字段值,从而能够生成“动态文本”。
Caution
若一个元素存在常量文本,同时存在<zxl:text>元素,则在转换后会以<zxl:text>元素的值覆盖常量文本。若存在并列多个<zxl:text> 元素,则他们之间间不会覆盖,而是会“串接”起来。
- 父元素:
-
一般为任意可以包含文本的html元素。
- 子元素:
-
文本模板,也可以使用<zxl:const> <zxl:value>元素。
- 属性:
-
if ,可以选,表示只有当条件满足时,才生成文本。
- 示例:
-
<a> <zxl:attribute name="href">javascript:void 0;</zxl:attribute> <zxl:attribute name="onclick"> window.external.Call('[[@f_cliOpId]]','[[@f_cliParams]]','[[@f_srvParams]]') </zxl:attribute> <zxl:text>[[@f_caption]] </zxl:text> </a>
在上例中<zxl:text>[[@f_caption]] </zxl:text>中使用了文本模板,从而生成了<a>元素的文本值。当当前行的f_caption字段变化时,会自动把其值赋值给<a>元素。
<zxl:attribute>属性元素
- 说明:
-
用来给一个html元素增加或者修改属性。若原来元素相应的属性已经存在,则会覆盖。
- 父元素:
-
一般为html元素。
- 子元素:
-
文本值模板。或者<zxl:const>和<zxl:value>元素。
- 属性 if:
-
if 可以选,只有当if属性的值为真时,才生成此属性。
- 注意:
-
当有多个<zxl:attribute>元素时,后面的会覆盖前面的。通过if属性可以满足 if else if else之类的嵌套。
- 示例:
-
<a> <zxl:attribute name="href">javascript:void 0;</zxl:attribute> <zxl:attribute name="onclick"> window.external.Call('[[@f_cliOpId]]','[[@f_cliParams]]','[[@f_srvParams]]') </zxl:attribute> <zxl:text>[[@f_caption]] </zxl:text> </a>
在上例中,通过多个<zxl:attribute>生成<a>元素的各种属性,比如:href, onclick等。同理,可以生产style等属性。
<zxl:if if="ifExpression">元素
- 说明:
-
用在html元素里面,作为子元素,用来代替@if属性(在html元素中不能有@if属性)。用在其他元素中,则会被忽略。 其作用为:当此元素if属性的值为真时,则生成父元素,否则不生成父元素。
- 父元素:
-
任何html元素。
- 子元素:
-
无。
- 示例:
-
<a><zxl:if if="@f_test"/></a>
- 属性if
-
必选,为当前节点环境下的逻辑表达式。
- 转换后的目标元素:
-
<xsl:if>注意生成的<xsl:if>在其父元素的"外层"。
<zxl:const if="Expression">元素
- 说明:
-
一般情况下用文本值模板来代替,他是中间转换中生成的元素。但因为他可以有if属性,所以可以在需要需要条件时使用。 其中不能有属性值表达式,不能有变量,只能是常量文本。
- 转换模板元素:
-
若其父元素为:<zxl:text>则转换为:<xsl:text>。若其父元素为<zxl:attribute>,则直接转换为文本,不生成元素。
- 父元素:
-
<zxl:attribute> <zxl:text>
- 子元素:
-
无
<zxl:value if="Expression">元素
- 说明:
-
一般情况下用文本值模板来代替,他是中间转换中生成的元素。但因为他可以有if属性,所以可以在需要需要条件时使用。 其中不能有属性值表达式,和<zxl:const>元素不同的是:他可以带有变量:比如字段@fieldName,或者环境变量$var等。
- 转换模板元素:
-
[<xsl::if]<xsl::value-of select=".">[<xsl:if>]
- 父元素:
-
<zxl:attribute> <zxl:text>
- 子元素:
-
无
<zxl:var name="varName">元素
- 说明:
-
定义外部变量。一般用在html网页处理中,以用户的选择不同而呈现不同的界面。
- 转换模板元素:
-
<xsl:variable name={@name}/>
- 父元素:
-
<zxl:root>
- 子元素:
-
无
<zxl:comment>元素
- 说明:
-
仅仅给中间转换的xsl增加注释。
- 转换模板元素:
-
<xsl:variable name={@name}/>
- 父元素:
-
<zxl:root>
- 子元素:
-
无
[[textTempate]]文本模板
- 说明:
-
可以用在<zxl:attribute>和<zxl:text>元素中,用来简单的“嵌入”生成相应的信息。在实际的转换中,会自动转换为<zxl:const>和<zxl:value>元素。
- 父元素
-
<zxl:attribute>, <zxl:text>
- 示例
-
<a> <zxl:attribute name="href">javascript:void 0;</zxl:attribute> <zxl:attribute name="onclick"> window.external.Call('[[@f_cliOpId]]','[[@f_cliParams]]','[[@f_srvParams]]') </zxl:attribute> <zxl:text>标题:[[@f_caption]] </zxl:text> </a>
在上例中,[[@f_cliOpId]]','[[@f_cliParams]]','[[@f_srvParams]]会自动转换为3个<zxl:value>元素。 标题:[[@f_caption]]会转换为 <zxl:const>标题:</zxl:const><zxl:value">@f_caption<zxl:value>. 最终会转换为: <xsl:text>标题:</xsl:text><xsl:value-of select="@f_caption"/>