XML Publisher学习总结

  • 可以采取两种方式编写布局语言,一是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,如

2、 前(不同的E中哦)加。这个翻译后,实际上是:

       

        

        page

        

3、 前加page,

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

4、 前加page

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

  • 分页(条件分页)

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

        

        page

        

         注:要在每行前哦; if和分页代码要写在同一个E中.

  • 分页(固定行分页)

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

        

        page

        

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

       

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

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

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

The program was not successful

The program was

not

successful.

The program was not successful

The program was not successful.

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

If-Then-Else 语句

1000 Then

                 'Higher‘

             Else If AMOUNT < 1000 then

                 'Lower‘

             Else

                 'Equal‘

             End If?>

条件格式化—Choose语句

when:expression?>

……

when:expression?>

……

……

  • 根据条件显示或隐藏行

YEAR MONTH  SALES
foreach  if year month salesendif   endforeach


        其中: foreach                          

                  if                                     5000?>

                 endif                               

                 endforeach                   

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

if@row:condition?>

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

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


YEAR MONTH  SALES
foreach  format year month sales  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?> --背景颜色

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

1?>  控制字體大小

 

根据条件显示或隐藏列

            if@column:condition?>

……

 

  

例如:

  

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

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

1000?>

  

  red

  

例:


account debit credit
F   account CH1 debit CH2  credit  E


其中:F                             

         CH1                         1000?>

                                               red

                                          

        CH2                           1000?>

                                              red

                                             

        E                                

  •  连续向下累积合计效果

要实现以下效果:


id amt total
1 100 100
2 200 300
3 300 600


构造如下:

set_var


id amt total
F  id amt total  E


其中: set_var                   --定义变量

          F                        

          total                           --累加第行值

                                                        --通过变量显示累加值

          E                         

 

  •  条件加总

 

 

变量知识:

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

 


  • 排序

升序/降序: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’;?>

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数据:



Motor Vehicle Dealers
2005
Q1
1000


Motor Vehicle Dealers
2005
Q2
2000


Motor Vehicle Dealers
2004
Q1
3000


Motor Vehicle Dealers
2004
Q2
3000


Motor Vehicle Dealers
2003
...


Home Furnishings
...


Electronics
...


Food and Beverage
...


 

想要的结果:


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


模板结构:


INDUSTRY   header column for  year  end
for    INDUSTRY for  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()

系统当前日期

请使用浏览器的分享功能分享到微信等