XMLP之开发笔记

前端之家收集整理的这篇文章主要介绍了XMLP之开发笔记前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  • 可以采取两种方式编写布局语言,一是XSL语句,二是XMLP简易语句,个人建议使用前者,因为其是国际通行标准。另外,这两种语法可以混合使用,比如上面的条件格式化行和单元格。
    在RTF中直接写的只能是XMLP简易语句;在窗体域中则上述两者皆可。
    标准的页眉页脚中不允许使用窗体域;但扩展的页眉页脚中可以使用。

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

<?start:body?>

……

<?end body?>

  • 嵌套模板

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

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

1.定义子模板

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

<?template:internaltemplate name?>

……

<?end template?>

2.调用子模板

下面两条语句都可以:

<?call:internal template name?>

<?call-template:internaltemplate 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: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?>

猜你在找的XML相关文章