千家信息网

XML Publisher 技巧

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,更多个人分类: Form 开发可以采取两种方式编写布局语言,一是 XSL 语句,二是 XMLP 简易语句,个人建议使用前者,因为其是国际通行标准。另外,这两种语法可以混合使用,比如上面的条件格式化行和
千家信息网最后更新 2025年01月21日XML Publisher 技巧

更多

个人分类: Form 开发

可以采取两种方式编写布局语言,一是 XSL 语句,二是 XMLP 简易语句,个人建议使用前者,因为其是国际通行标准。另外,这两种语法可以混合使用,比如上面的条件格式化行和单元格。
RTF 中直接写的只能是 XMLP 简易语句;在窗体域中则上述两者皆可。
标准的页眉页脚中不允许使用窗体域;但扩展的页眉页脚中可以使用。

如果模板中要求多个页眉页脚,使用下面的标记来标示出报表的主体部分

start:body ?>

……

  • 嵌套模板

由于在页眉和页脚中不允许使用窗体域,而当报表页眉页脚中希望插入 XML 数据的时候,可以考虑使用嵌套模板。

嵌套模板是在模板中定义一个子模板,然后在需要的地方调用它,如在页眉页脚中调用它。

1. 定义子模板

子模板标记之间可以使用任何的标记和内容,和模板的主体部分没有任何区别

template:internal template name?>

……

2. 调用子模板

下面两条语句都可以:

call-template:internal template name?>

  • XML中计算除法用div

例如:

  • XML Publisher 支持 Word 中的分栏功能,使报表输出能够以多栏的方式打印。

如下是地址簿的多栏打印效果

  • 分页(按组分页)

分页是自然的,但如果想在某处强制分页如新组新页,那么可以使用 Word 的分页符( CTRL+ENTER 快捷键),但会导致最后出现空白页。

可以使用如下几种方式:

1 、分组声明中加 @ section for-each@section:Group_Name ?>

2 ( 不同的 E 中哦 ) split-by-page-break:?> 这个翻译后,实际上是:

< xsl:if test="position()

< xsl:attribute name="break-before">page xsl:attribute >

xsl:if >

3 前加 < xsl:attribute name="break-after">page xsl:attribute >

此法下 RTF 最后无空白页,但 PDF 有空白页;

4 end for-each?> 前加 < xsl:attribute name="break-before">page xsl:attribute >

此法下 RTF PDF 最后都有空白页。

  • 分页(条件分页)

任意条件分页,需要借助 IF + 上面的 break-after 或者 break-before 如:

if:CURRENCY_CODE ="CNY"?>

< xsl:attribute name="break-before">page xsl:attribute >

?>

: 要在 每行 end foreach ?> 前哦 ; if 和分页代码要写在同一个 E .

  • 分页( 固定行分页 )

固定行分页,需要借助 IF + 上面的 break-after 或者 break-before 在行 end foreach ?> 前,如下语句控制每页 5 行:

if:position () mod 5 =0?>

< xsl:attribute name="break-before">page xsl:attribute >

在测试过程中发现问题,第一句改为下面这句:

if: position() != 1 and position() mod 5 = 1?>

  • 强制页码从某一个数值起始

: 参数pagenumber(1.可以是固定的值 2.可以XML传过来的值)

:其中pagenumber为在RTF中自定义的变量.

  • RTF中自定义变量

    • < ?param@begin:parameter_name;parameter_value ?>,引用的话前面要加$

  • IF 语句

The program was if:SUCCESS ='N'?>not successful

The program was

not

successful.

The program was if@inlines:SUCCESS ='N'?>not successful

The program was not successful.

使用@ inlines 使文本在同一行显示

If-Then-Else 语句

xdofx:If AMOUNT > 1000 Then

'Higher'

Else If AMOUNT < 1000 then

'Lower'

Else

'Equal'

End If?>

条件格式化- Choose 语句

when:expression ?>

……

when:expression ?>

……

……

  • 根据条件显示或隐藏行


YEARMONTHSALES
foreach if yearmonthsales endif endforeach

其中: foreach

if 5000?>

endif

endforeach

  • 根据条件格式化行(加亮,背景等)

if@row:condition ?>

< xsl:attribute name="background-color" xdofo:ctx =" incontext "> lightgray xsl:attribute >

如果不加@ row, 则仅局限于单元格


YEARMONTHSALES
foreach format yearmonthsales endforeach

其中: foreach

format < ?if@row:position () mod 2=0?>
lightgray

endforeach

RGB颜色的写法:

< ?if@row:REF_NO3="After Sub Total:"?>< ?attribute@incontext:background-color;'RGB(255,0,0)'?> --背景颜色

< ?if@row:REF_NO3="Before Sub Total:"?>< ?attribute@incontext:color;'#114515'?>------字体颜色

1?> 控制字體大小

根据条件显示或隐藏列

if@column:condition ?>

……


if@column:condition ?>

例如:

if@column : TypeName ="PRIVATE"?>

  • 条件格式化-单元格加亮

我的理解加亮单元格也就是加一个背景,这里的 block 和前面说的 incontext 作用范围有所区别。在 if 后不加@ row 都是指 cell, 加@ row incontext 作用于 row,block 作用于 column。

if:debit >1000?>

< xsl:attribute xdofo:ctx ="block" name="background-color">

red

xsl:attribute >

例:


accountdebitcredit
F accountCH1 debitCH2 credit E

其中: F

CH1 1000?>

red

CH2 1000?>

red

E

  • 连续向下累积合计效果

要实现以下效果:


idamttotal
1100100
2200300
3300600

构造如下:

set_var


idamttotal
F idamttotal E

其中: set_var xdoxslt:set_variable ($_XDOCTX, ' Var ', 0)?> --定义变量

F

total xdoxslt:set_variable ($_XDOCTX, ' Var ', xdoxslt:get_variable ($_XDOCTX,' Var ') + amt)?> --累加第行值

xdoxslt:get_variable ($_XDOCTX, ' Var ')?> --通过变量显示累加值

E

  • 条件加总

变量知识 :

变量使用" set/get" 的方式来分配、更新和取得变量的值


< xsl:value-of select="$start"/>

  • 排序

升序/降序:ascending / descending

数据类型:text / number / date

注意以上字符串的大小写,这里的语法对大小写是敏感的。

可以有多个排序字段; 写在for-each和end for-each之间的同一个E中或不同的E中.

  • 数字和日期格式化

数字格式化

XML Publisher 支持两种数字格式化方式:

Word 本身的数字格式掩码

Oracle format-number 功能

日期格式化

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, December 31, 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, December 31, 1999 6:15 PM GMT

  • 矩阵报表(也可guide中搜索:split-column-data)

XML数据:


< RESULTS>
< INDUSTRY>Motor Vehicle Dealers
< YEAR>2005
< QUARTER>Q1
< SALES>1000
< /RESULTS>
< RESULTS>
< INDUSTRY>Motor Vehicle Dealers
< YEAR>2005
< QUARTER>Q2
< SALES>2000
< /RESULTS>
< RESULTS>
< INDUSTRY>Motor Vehicle Dealers
< YEAR>2004
< QUARTER>Q1
< SALES>3000
< /RESULTS>
< RESULTS>
< INDUSTRY>Motor Vehicle Dealers
< YEAR>2004
< QUARTER>Q2
< SALES>3000
< /RESULTS>
< RESULTS>
< INDUSTRY>Motor Vehicle Dealers
< YEAR>2003
...
< /RRESULTS>
< RESULTS>
< INDUSTRY>Home Furnishings
...
< /RESULTS>
< RESULTS>
< INDUSTRY>Electronics
...
< /RESULTS>
< RESULTS>
< INDUSTRY>Food and Beverage
...
< /RESULTS>
< /ROWSET>

想要的结果:


INDUSTRY200520042003
Motor Vehicle Dealers300060001200
Home Furnishings320077703300
Electronics900090004300
Food and Beverage12009001600

模板结构:


INDUSTRY header columnfor year end
for INDUSTRYfor sum(sales) end

其中: header column

for: < ?for-each-group@column:RESULTS;YEAR ?>

YEAR

end

for:

INDUSTRY

for: < ?for-each-group@cell:currentgroup();YEAR ?>

sum(Sales)

end

end

  • SQL与XML


SQL Statement

Usage

Description

2+3

2-3

2*3

2/3

2**3

指数

2||3

连接

lpad('aaa',10,'.')

左边填充

rpad('aaa',10,'.')

右边填充

decode('xx','bb','cc','xx','dd')

decode 判断功能

instr('abcab','a',2)

Instr 查找子串位置

substr('abcdefg'),2,3)

查找子串

replace(name,'John','Jon')

替换

to_number('12345')

转换为数字

to_char(12345)

转换为字符

sysdate()

系统当前日期

http://blog.csdn.net/rfb0204421/article/details/7478090

http://www.cnblogs.com/quanweiru/archive/2012/10/19/2730842.html


0