2014-01-07 31 views
0

我有一些XML,我試圖將其轉換爲適合打印的報表。到目前爲止,一切都進展順利,除了一部分。在for-each期間插入新元素到提供的XML中

這涉及當前正在輸出的行的當前頁碼。我使用<fo:page-number/>來獲取當前頁碼,但是我發現在使用與當前行同級相關的信息後,我發現我無法在範圍內設置一個變量,請使用for-each獨自被改變。

所以,我目前玩弄的想法是,在每次迭代時,正在使用的當前節點都有一個新的元素(或屬性)被引入,其中包含當時出現的fo:page-number的值。然後,在下一次迭代中,我將從preceding-sibling::中獲取元素/屬性,然後測試當前的fo:page-number是否與該值不同。

不幸的是,我沒有太多的運氣找到一種方法來做到這一點,我從谷歌搜索獲得的所有結果都來自w3fools的結果。有誰知道這是否可能,如果有的話,怎麼做?

+0

我不確定我在這裏理解你的邏輯 - 你使用XSLT生成XSL-FO,然後使用FO處理器將生成的XSL-FO轉換爲渲染輸出,只有在這個階段你才知道什麼值一個特定的''會產生(XSLT和XSL-FO處理器可能是同一個軟件包的一部分,但在概念上它們是兩個獨立的階段)。您不能在XSLT中使用'page-number'標籤產生的輸出值。 –

+0

嗯,這是一個恥辱。是否還有其他函數(很可能在fo內)允許將當前頁碼作爲邏輯中的變量使用? – topherg

+0

在什麼階段你想使用'fo:page-number?'在XSLT階段(即將XML數據轉換爲XSL-FO),頁碼是未知的。但是,爲什麼不更清楚地說明你打算實現的目標(可能包括XML示例或描述輸出) - 那麼,也許有人可以提出另一種解決方案? –

回答

2

爲了答覆,不,這是不可能的。

基本上,當屬性omit-header-at-break設置爲「false」時,可以在XSL-FO中在每個頁面頂部重複標題。有關詳細信息,請參閱http://www.schemacentral.com/sc/fo11/a-table-omit-header-at-break-1.htmlhttp://www.w3.org/TR/xsl/#table-omit-header-at-break。我知道這是在Apache FOP中實現的,但也應該與其他FO處理器一起使用。

但是當然,這個解決方案假設你的表頭被分類爲頭,也就是說,在語義上是頭,而不是表面看起來像頭,而只是表的第一行。我知道你的情況後者是真的。

(不過,我無法想象什麼樣的規格可以讓你從定義每個表的第一行作爲可重複的標題。)

此外,雖然XML數據轉換爲XSL-FO, fo:page-number指令的結果尚不可用。因此,你不能在你的樣式表中使用它(這部分答案由@Ian Roberts貢獻)。這是因爲它由像Saxon這樣的XSLT處理器處理的XSLT樣式表沒有FO指令的概念。 fo:page-number僅由FO處理器解釋。


我看到的唯一的解決辦法是改變你的規格,讓fo:table-header元素。通過僅使用表格行和單元格,可以在分頁符後有效地「副線」重複頁眉。