您好,登錄后才能下訂單哦!
更多
個人分類: 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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。