XSL-FO:如何在region-body而不是region-after中输入文本?

时间:2015-03-18 00:09:06

标签: xsl-fo

我正在查看遗留的XSL-FO文件。

目前,它会在左下角打印名称。有谁知道如何修改下面的代码,以便名称出现在正文部分?

我对一些事情感到困惑:

1)在simple-page-master中,

为什么有这两个代码片段,包括region-body和region-after?

                <fo:region-body/>
                <fo:region-after extent="1in"/>

哪个正在使用?显然,正在使用region-after。

2) flow-name的值只是任何旧字符串,还是非常具体且有意义?我将名称更改为xsl-region-blah并且出现错误,因此告诉我它非常具体

  <fo:static-content flow-name="xsl-region-after"

但是,我不明白上面的代码是如何发挥作用的,因为根据RenderX的教程,如果页面序列主引用指向页面主文件,那么流程将来自页面主文件,例如,

<fo:page-sequence master-reference="Mail">  

指向Mail,所以它会引用这个:

            <fo:simple-page-master margin-left="1in" margin-right=".5in" margin-top=".5in"
                                   page-width="8.5in" page-height="11in" master-name="Mail">
                <fo:region-body/>
                <fo:region-after extent="1.6in"/>
            </fo:simple-page-master>

并且该页面主页使用region-body或region-after。我没有得到的是,它使用的是哪一个,身体还是之后?

以下代码属于更大的xsl-fo文件。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:output version="1.0" method="xml" omit-xml-declaration="no" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master margin-left=".5in" margin-right=".5in" margin-top=".5in" margin-bottom=".5in"
            page-width="8.5in" page-height="11in" master-name="PickUp">
          <fo:region-body/>
          <fo:region-after extent="1in"/>
        </fo:simple-page-master>

        <fo:simple-page-master margin-left="1in" margin-right=".5in" margin-top=".5in"
            page-width="8.5in" page-height="11in" master-name="Mail">
          <fo:region-body/>
          <fo:region-after extent="1.6in"/>
        </fo:simple-page-master>

        <fo:simple-page-master margin-left=".5in" margin-right=".5in" margin-top=".5in" margin-bottom=".5in"
            page-width="8.5in" page-height="11in" master-name="Fax">
          <fo:region-body/>
          <fo:region-after/>
        </fo:simple-page-master>
      </fo:layout-master-set>


      <xsl:for-each select="transactionItemList/transactionItems">
        <xsl:if test="deliveryInfo/deliveryMethod/type='Mail'">
          <fo:page-sequence master-reference="Mail">
            <fo:static-content flow-name="xsl-region-after"  font-size="9pt" font-family="Univers Medium">

              <fo:block-container>
                <fo:table>
                  <fo:table-column column-number="1"/>
                  <fo:table-body>
                    <fo:table-row text-align="left" height="1in">
                      <fo:table-cell display-align="center">
                        <fo:block >
                            Person who ordered transcript:
                        </fo:block>
                        <fo:block >
                            Firstname: <xsl:value-of select="studentFirstName"/>
                        </fo:block>
                        <fo:block>
                            Lastname: <xsl:value-of select="studentLastName"/>
                        </fo:block>
   ...
   ...
   ...

提前感谢您的帮助。顺便说一句,我确实改变了区域之后的区域 - 但它不会起作用,因为它提到了重复的区域体。我删除了区域后,我收到错误。

2 个答案:

答案 0 :(得分:1)

在FO文件中,fo:layout-master-set部分定义了页面几何

  • 每个fo:simple-page-master描述一种类型的页面:宽度,高度,边距,最重要的是页面区域,其中可以放置一些内容 ; 主定义中存在区域不需要实际放置在其中的内容;
  • 对于复杂文档,fo:page-sequence-master允许定义必须如何使用不同的fo:simple-page-master来创建页面(例如,在奇数页和偶数页之间交替,具有不同的边距和区域)。< / LI>

fo:page-sequence元素定义内容

  • fo:static-content定义放置在边区域内的一段内容,并在包含该区域的每个页面中重复fo:page-numberfo:retrieve-marker即可用于插入变量内容);
  • fo:flow定义了分页的主要内容。

每个fo:page-sequence引用一个页面主页,其fo:static-contentfo:flow被映射(显式或依赖于默认值)到特定区域。


您的页面布局定义了两个名为xsl-region-bodyxsl-region-after的区域(这些是默认名称); fo:flow内的主要内容映射到xsl-region-body,而定义某种标题的静态内容则映射到xsl-region-after

如果你想要旧的&#34;页面标题&#34;要在主要内容之前只显示一次而不是在每个页面的顶部重复,您必须删除fo:static-content,在现有元素之前将其内容移动到fo:flow内。

你会有这样的事情:

<fo:page-sequence master-reference="Mail">
    <fo:flow flow-name="xsl-region-body" font-size="9pt" font-family="Univers Medium">
        <!-- content moved from the old static content -->
        <fo:block-container>
            <fo:table>
                <fo:table-column column-number="1"/>
                <fo:table-body>
                    <fo:table-row text-align="left" height="1in">
                        <fo:table-cell display-align="center">
                            <fo:block >
                                Person who ordered transcript:
                            </fo:block>
                            ...
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
        </fo:block-container>
        <!-- the old flow content -->
        ... 
    </fo:flow>
</fo:page-sequence>

答案 1 :(得分:0)

似乎值得一读XSL-FO规范:http://www.w3.org/TR/xsl11/

您可以避免完全阅读,以下是您的问题的关键部分:关于<fo:region-body><fo:region-after>,请参阅§6.4.13 fo:simple-page-master ,它解释和描述了页面布局模型。

回答你的问题: 1)基本上,region-body是文档的主要部分,region-after将是footer(类似地,你将有一个区域 - 在此之前对应于标题)。您在此处找到的元素旨在将属性(边距,边框,...)设置为可以输出文本的页面区域。 page-master用于定义文档的全局分页属性。

2)是的,xsl-region-after是一个预定义的命名(据我所知,这些名称可以重新定义,但xsl-region-after等是可以直接使用的默认名称)。有关详细信息,请参阅上面提到的规范的§6.4.1.4流程和流程映射

最后:为了解决您的问题并在正文部分中插入“名称”,您需要将其插入到<fo:flow flow-name="xsl-region-body">之后,您会在<fo:static flow-name="....">序列中找到它}。