- 可以采取两种方式编写布局语言,一是XSL语句,二是XMLP简易语句,个人建议使用前者,因为其是国际通行标准。另外,这两种语法可以混合使用,比如上面的条件格式化行和单元格。
在RTF中直接写的只能是XMLP简易语句;在窗体域中则上述两者皆可。 标准的页眉页脚中不允许使用窗体域;但扩展的页眉页脚中可以使用。
- 如果模板中要求多个页眉页脚,使用下面的标记来标示出报表的主体部分
<?start:body?>
……
<?end body?>
由于在页眉和页脚中不允许使用窗体域,而当报表页眉页脚中希望插入XML数据的时候,可以考虑使用嵌套模板。
嵌套模板是在模板中定义一个子模板,然后在需要的地方调用它,如在页眉页脚中调用它。
1.定义子模板
子模板标记之间可以使用任何的标记和内容,和模板的主体部分没有任何区别
<?template:internaltemplate name?>
……
<?end template?>
2.调用子模板
下面两条语句都可以:
<?call:internal template name?>
<?call-template:internaltemplate name?>
例如:<?pick_qty div req_qty?>
如下是地址簿的多栏打印效果
分页是自然的,但如果想在某处强制分页如新组新页,那么可以使用Word的分页符(CTRL+ENTER快捷键),但会导致最后出现空白页。
可以使用如下几种方式:
1、分组声明中加@section,如<?for-each@section:Group_Name?>;
2、<?end for-each?>前(不同的E中哦)加<?split-by-page-break:?>。这个翻译后,实际上是:
<xsl:iftest="position()<last()">
<xsl:attributename="break-before">page</xsl:attribute>
</xsl:if>
3、<?end for-each?>前加<xsl:attributename="break-after">page</xsl:attribute>,
此法下RTF最后无空白页,但PDF有空白页;
4、<?end for-each?>前加<xsl:attributename="break-before">page</xsl:attribute>
此法下RTF、PDF最后都有空白页。
任意条件分页,需要借助IF +上面的break-after或者break-before,如:
<?if:CURRENCY_CODE="CNY"?>
<xsl:attributename="break-before">page</xsl:attribute>
<?end if?>
注:要在每行的<?endforeach?>前哦; if和分页代码要写在同一个E中.
固定行分页,需要借助IF +上面的break-after或者break-before,在行<?endforeach?>前,如下语句控制每页5行:
<?if:position() mod 5 =0?>
<xsl:attributename="break-before">page</xsl:attribute>
<?end if?>
在测试过程中发现问题,第一句改为下面这句:
<?if: position()!= 1 andposition() mod 5 = 1?>
<?initial-page-number:pagenumber?>: 参数pagenumber(1.可以是固定的值 2.可以XML传过来的值)
或<?initial-page-number:$pagenumber?>:其中pagenumber为在RTF中自定义的变量.
The program was <?if:SUCCESS=’N’?>not<?end if?> successful
The program was
not
successful.
The program was <?if@inlines:SUCCESS=’N’?>not<?end if?> successful
The program was not successful.
使用@inlines使文本在同一行显示
If-Then-Else语句
<?xdofx:if element_condition then result1 else result2 end if?>
<?xdofx:IfAMOUNT > 1000 Then
'Higher‘
Else If AMOUNT < 1000 then
'Lower‘
Else
'Equal‘
End If?>
条件格式化—Choose语句
<?choose:?>
<?when:expression?>
……
<?when:expression?>
……
<?otherwise?>
……
<?end choose?>
YEAR |
MONTH |
SALES |
foreachifyear |
month |
salesendifendforeach |
其中:foreach <?for-each:SALE?>
if <?if:SALES>5000?>
endif <?end if?>
endforeach <?end for-each?>
<?if@row:condition?>
<xsl:attributename="background-color"xdofo:ctx="incontext">lightgray</xsl:attribute>
<?end if?>
如果不加@row,则仅局限于单元格
YEAR |
MONTH |
SALES |
formatyear |
month |
salesendforeach |
其中:foreach <?for-each:SALE?>
format <?if@row:position() mod 2=0?> <xsl:attribute name="background-color" xdofo:ctx="incontext">lightgray</xsl:attribute>
<?end if?>
endforeach <?end for-each?>
RGB颜色的写法:
<?if@row:REF_NO3="AfterSub Total:"?><?attribute@incontext:background-color;'RGB(255,0)'?><?endif?>--背景颜色
<?if@row:REF_NO3="BeforeSub Total:"?><?attribute@incontext:color;'#114515'?><?endif?>------字体颜色
<?if:2>1?><fo:block font-size='20pt'><?end if?><?REF_NO2?> 控制字體大小
根据条件显示或隐藏列
<?if@column:condition?>
……
<?end if?>
<?if@column:condition?>
<?quantity?>
<?end if?>
例如:
<?if@column:TypeName="PRIVATE"?>
<?quantity?>
<?end if?>
我的理解加亮单元格也就是加一个背景,这里的block和前面说的incontext作用范围有所区别。在if后不加@row都是指cell,加@row后incontext作用于row,block作用于column。
<?if:debit>1000?>
<xsl:attributexdofo:ctx="block" name="background-color">
red
</xsl:attribute>
<?end if?>
例:
account |
debit |
credit |
Faccount |
CH1debit |
CH2creditE |
其中:F <?for-each:account?>
CH1 <?if:debit>1000?>
<xsl:attribute xdofo:ctx="block" name="backgroundcolor">red</xsl:attribute>
<?end if?>
CH2<?if:credit>1000?>
<xsl:attribute xdofo:ctx="block" name=background-color">red</xsl:attribute>
<?end if?>
E<?end for-each?>
要实现以下效果:
id |
amt |
total |
1 |
100 |
100 |
2 |
200 |
300 |
3 |
300 |
600 |
构造如下:
set_var
id |
amt |
total |
Fid |
amt |
totalE |
其中:set_var <?xdoxslt:set_variable($_XDOCTX,’Var’,0)?> --定义变量
F <?for-each:id?>
total<?xdoxslt:set_variable($_XDOCTX,xdoxslt:get_variable($_XDOCTX,’Var’) + amt)?> --累加第行值
<?xdoxslt:get_variable($_XDOCTX,’Var’)?> --通过变量显示累加值
E<?end for-each?>
<?sum(current-group)[sourcename!='']/receipt_amt?>
变量知识:
变量使用“set/get”的方式来分配、更新和取得变量的值
<?xdoxslt:set_variable($_XDOCTX,’variable name’,value)?>
<?xdoxslt:get_variable($_XDOCTX,’variable name’)?>
<xsl:variable name="start" xdofo:ctx="incontext" select="position()"/> <xsl:value-of select="$start"/>
<?sort:element name?>
<?sort:SAL;'ascending';data-type='text'?>
升序/降序:ascending / descending
数据类型:text / number / date
注意以上字符串的大小写,这里的语法对大小写是敏感的。
可以有多个排序字段; 写在for-each和end for-each之间的同一个E中或不同的E中.
<?for-each:G_VENDOR_NAME?><?sort:VENDOR_NAME?><?sort:INVOICE_NUM?><?end for-each?>
数字格式化
XML Publisher支持两种数字格式化方式:
Word本身的数字格式掩码
Oracle的format-number功能
<?format-number:fieldname;’999G999D99’?>
日期格式化
XML Publisher支持三种日期格式化方式
Word本身的日期格式掩码
Oracle的format-date功能
<?format-date:date_string; ’FORMAT_MASK’;?>
<?format-date:hiredate;’YYYY-MM-DD’?>
Oracle的抽象日期格式掩码语法
<?format-date:fieldname;’MASK’?>
<?format-date:hiredate;’SHORT’?>
<?format-date:hiredate;’LONG_TIME_TZ’?>
抽象日期格式掩码列表
掩码 |
US输出实例 |
SHORT |
2/31/99 |
MEDIUM |
Dec 31,1999 |
LONG |
Friday,December 31,1999 |
SHORT_TIME |
12/31/99 6:15 PM |
MEDIUM_TIME |
Dec 31,1999 6:15 PM |
LONG_TIME |
Friday,1999 6:15 PM |
SHORT_TIME_TZ |
12/31/99 6:15 PM GMT |
MEDIUM_TIME_TZ |
Dec 31,1999 6:15 PM GMT |
LONG_TIME_TZ |
Friday,1999 6:15 PM GMT |
- 矩阵报表(也可guide中搜索:split-column-data)
XML数据:
<ROWSET> <RESULTS> <INDUSTRY>Motor Vehicle Dealers</INDUSTRY> <YEAR>2005</YEAR> <QUARTER>Q1</QUARTER> <SALES>1000</SALES> </RESULTS> <RESULTS> <INDUSTRY>Motor Vehicle Dealers</INDUSTRY> <YEAR>2005</YEAR> <QUARTER>Q2</QUARTER> <SALES>2000</SALES> </RESULTS> <RESULTS> <INDUSTRY>Motor Vehicle Dealers</INDUSTRY> <YEAR>2004</YEAR> <QUARTER>Q1</QUARTER> <SALES>3000</SALES> </RESULTS> <RESULTS> <INDUSTRY>Motor Vehicle Dealers</INDUSTRY> <YEAR>2004</YEAR> <QUARTER>Q2</QUARTER> <SALES>3000</SALES> </RESULTS> <RESULTS> <INDUSTRY>Motor Vehicle Dealers</INDUSTRY> <YEAR>2003</YEAR> ... </RRESULTS> <RESULTS> <INDUSTRY>Home Furnishings</INDUSTRY> ... </RESULTS> <RESULTS> <INDUSTRY>Electronics</INDUSTRY> ... </RESULTS> <RESULTS> <INDUSTRY>Food and Beverage</INDUSTRY> ... </RESULTS> </ROWSET>
想要的结果:
INDUSTRY |
2005 |
2004 |
2003 |
Motor Vehicle Dealers |
3000 |
6000 |
1200 |
Home Furnishings |
3200 |
7770 |
3300 |
Electronics |
9000 |
9000 |
4300 |
Food and Beverage |
1200 |
900 |
1600 |
模板结构:
INDUSTRYheader column |
foryearend |
INDUSTRY |
forsum(sales)end |
其中: header column <?horizontal-break-table:1?>
for: <?for-each-group@column:RESULTS;YEAR?>
YEAR <?YEAR?>
end <?end for-each-group?>
for: <?for-each-group:RESULTS;INDUSTRY?>
INDUSTRY <?INDUSTRY?>
for: <?for-each-group@cell:currentgroup();YEAR?>
sum(Sales) <?sum(current-group()//SALES)
end <?end for-each-group?>
end <?end for-each-group?>
SQL Statement |
Usage |
Description |
2+3 |
<?xdofx:2+3?> |
加 |
2-3 |
<?xdofx:2-3?> |
减 |
2*3 |
<?xdofx:2*3?> |
乘 |
2/3 |
<?xdofx:2/3?> |
除 |
2**3 |
<?xdofx:2**3?> |
指数 |
2||3 |
<?xdofx:2||3?> |
连接 |
lpad(‘aaa’,10,’.’) |
<?xdofx:lpad(‘aaa’,’.’)?> |
左边填充 |
rpad(‘aaa’,’.’) |
<?xdofx:rpad(‘aaa’,’.’)?> |
右边填充 |
decode(’xx’,’bb’,’cc’,’xx’,’dd’) |
<?xdofx:decode(’xx’,’dd’)?> |
decode判断功能 |
instr(’abcab’,’a’,2) |
<?xdofx:instr(’abcab’,2)?> |
Instr查找子串位置 |
substr(’abcdefg’),2,3) |
<?xdofx:substr(’abcdefg’),3)?> |
查找子串 |
replace(name,’John’,’Jon’) |
<?xdofx:replace(name,’Jon’)?> |
替换 |
to_number(‘12345’) |
<?xdofx:to_number(‘12345’)?> |
转换为数字 |
to_char(12345) |
<?xdofx:to_char(12345)?> |
转换为字符 |
sysdate() |
<?xdofx:sysdate()?> |
系统当前日期 |
1.<fo:bidi-override direction="ltr" unicode-bidi="bidi-override"><?ITEM_NO?></fo:bidi-override>
2.mod2=0><xsl:attributename="backgroundcolor"xdofo:ctx="incontext">lightgray</xsl:attribute><?end if?>
3.<?if@column:condition?>
4.<?xdofx: IFsubstr(ITEM_NO,1,4)='0001' THEN '编号:' ELSE IF substr(ITEM_NO,4)='0002' THEN '其它编号:' ELSE ' ' END IF?>
5.<?if:contains(ITEM_NO,'0001')?>'编号:'<?end if?> (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|