XML Publisher 技巧

来源:这里教程网 时间:2026-03-03 12:01:51 作者:

XML Publisher 技巧

2014年07月17日 14:14:00 papaya 阅读数:1369 个人分类: Form 开发

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

<? start:body ?> …… <?end body?>

嵌套模板

          由于在页眉和页脚中不允许使用窗体域,而当报表页眉页脚中希望插入 XML 数据的时候,可以考虑使用嵌套模板。           嵌套模板是在模板中定义一个子模板,然后在需要的地方调用它,如在页眉页脚中调用它。           1. 定义子模板             子模板标记之间可以使用任何的标记和内容,和模板的主体部分没有任何区别             <? template:internal template name?>                  ……             <?end template?>            2. 调用子模板               下面两条语句都可以:                <?call:internal template name?>                <? call-template:internal template name?>

XML中计算除法用div

            例如: <?pick_qty div req_qty?>

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

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

分页(按组分页)

分页是自然的,但如果想在某处强制分页如新组新页,那么可以使用 Word 的分页符( CTRL+ENTER 快捷键),但会导致最后出现空白页。 可以使用如下几种方式: 1 、分组声明中加 @ section <? for-each@section:Group_Name ?> 2 <?end for-each?> ( 不同的 E 中哦 ) <? split-by-page-break:?> 这个翻译后,实际上是:                 < xsl:if test="position()<last()">         < xsl:attribute name="break-before">page</ xsl:attribute >         </ xsl:if > 3 <?end for-each?> 前加 < 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 if ?>         : 要在 每行 <? 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 >         <?end if?>        在测试过程中发现问题,第一句改为下面这句:        <? if: position() != 1 and position() mod 5 = 1?>

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

<?initial-page-number:pagenumber?>: 参数pagenumber(1.可以是固定的值 2.可以XML传过来的值) 或<?initial-page-number:$pagenumber?>:其中pagenumber为在RTF中自定义的变量.

RTF中自定义变量

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

IF 语句

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:If AMOUNT > 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
foreach   if year month sales endif    endforeach

        其中: foreach                          <?for-each:SALE?>                   if                                     <?if:SALES>5000?>                  endif                               <?end if?>                  endforeach                     <?end for-each?>

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

<? if@row:condition ?> < xsl:attribute name="background-color" xdofo:ctx =" incontext "> lightgray </ xsl:attribute > <?end if?> 如果不加@ row, 则仅局限于单元格

YEAR MONTH  SALES
foreach   format year month sales  endforeach

其中: 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="After Sub Total:"?>< ?attribute@incontext:background-color;'RGB(255,0,0)'?><?end if?> --背景颜色 < ?if@row:REF_NO3="Before Sub Total:"?>< ?attribute@incontext:color;'#114515'?><?end if?>------字体颜色 <?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:attribute xdofo:ctx ="block" name="background-color">   red   </ xsl:attribute > <?end if?> 例:

account debit credit
F    account CH1 debit CH2 credit   E

其中: 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
F   id amt total   E

其中: set_var             <? xdoxslt:set_variable ($_XDOCTX, ’ Var ’, 0)?>      --定义变量           F                          <?for-each:id?>           total                    <? xdoxslt:set_variable ($_XDOCTX, ’ Var ’, 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’)?> <?xdoxslt:set_variable($_XDOCTX, ’x’, xdoxslt:get_variable($_XDOCTX, ’x’ + 1)?> <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, 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数据: <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

模板结构:

INDUSTRY   header column for   year   end
for     INDUSTRY for   sum(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与XML

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’,10,’.’)?> 左边填充 rpad(‘aaa’,10,’.’) <?xdofx:rpad(‘aaa’,10,’.’)?> 右边填充 decode(’xx’,’bb’,’cc’,’xx’,’dd’) <?xdofx:decode(’xx’,’bb’,’cc’,’xx’,’dd’)?> decode 判断功能 instr(’abcab’,’a’,2) <?xdofx:instr(’abcab’,’a’,2)?> Instr 查找子串位置

substr(’abcdefg’),2,3)

<?xdofx:substr(’abcdefg’),2,3)?>

查找子串

replace(name,’John’,’Jon’)

<?xdofx:replace(name,’John’,’Jon’)?>

替换

to_number(‘12345’)

<?xdofx:to_number(‘12345’)?>

转换为数字

to_char(12345)

<?xdofx:to_char(12345)?>

转换为字符

sysdate()

<?xdofx:sysdate()?>

系统当前日期

http://blog.csdn.net/rfb0204421/article/details/7478090 http://www.cnblogs.com/quanweiru/archive/2012/10/19/2730842.html

相关推荐