Search code examples
xsl-fo

Pages orientation depending on condition


im trying to change my document page orientation depending on conditions, but I dont know how this can be done. Reading the documentation didn't help much and couldn't find any examples.

I set my document like this:

<fo:layout-master-set>
        <fo:simple-page-master master-name="first-page" page-height="29.7cm" page-width="21.0cm" margin="1cm 2.1cm 0.8cm 2.1cm">
          <fo:region-body region-name="xsl-region-body" margin-top="105px" margin-bottom="50px"/>
          <fo:region-before region-name="xsl-region-before-first" extent="5in"/>
          <fo:region-after region-name="xsl-region-after" extent="5in" display-align="after"/>
        </fo:simple-page-master>
    <fo:simple-page-master master-name="other-page" page-height="21.0cm" page-width="29.7cm" margin="1cm 2.1cm 0.8cm 2.1cm">
      <fo:region-body region-name="xsl-region-body" margin-top="105px" margin-bottom="50px"/>
      <fo:region-before region-name="xsl-region-before-other" extent="5in"/>
      <fo:region-after region-name="xsl-region-after" extent="5in" display-align="after"/>
    </fo:simple-page-master>
        <fo:page-sequence-master master-name="pages">
      <fo:repeatable-page-master-alternatives>
              <fo:conditional-page-master-reference page-position="first" master-reference="first-page"/>
              <fo:conditional-page-master-reference page-position="only" master-reference="other-page"/>
      </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
  </fo:layout-master-set>


<fo:page-sequence master-reference="pages">
 <fo:static-content flow-name="xsl-region-before-first">
...
 </fo:static-content>
 <fo:static-content flow-name="xsl-region-before-first">
...
 </fo:static-content>
 <fo:static-content flow-name="xsl-region-before-first">
...
 </fo:static-content>
 <fo:flow flow-name="xsl-region-body">
 ...
 </fo:flow>

This is generating a first vertical page first, and then all the rest are horizontal pages. These horizontal pages are being generated in a for-each loop. What I would like to do is that after a specific page-before="break" which could be in any position, I could change the layout of the following page depending on the data of the for-each items.

Edit: Im using xmlns:fo version 2.0 My exact document should look like this:

  • First page (working fine)
  • X pages: LANDSCAPE VIEW, generated using a for-each loop overe itemsA (working fine)
  • Y pages: PORTRAIT VIEW, generated using a for-each loop overe itemsB (this is what i dont know how to do, how to change from landscape to portrait)
    <xsl:for-each select="itemsA">
    ...printed stuff...
    </xsl:for-each>
    <fo:block break-before="page">
    <xsl:for-each select="itemsB">
    ...printed stuff...
    </xsl:for-each>

Solution

    1. Make a separate fo:page-sequence-master (or fo:simple-page-master if there's no variation between left/right pages, etc.).
    2. Move your fo:page-sequence-master to within each xsl:for-each, with the fo:page-sequence-master referring to the appropriate fo:page-sequence-master (or `fo:simple-page-master).

    I.e.:

    <xsl:for-each select="itemsA">
      <fo:page-sequence master-reference="landscape">
        ...printed stuff...
      </fo:page-sequence>
    </xsl:for-each>
    <xsl:for-each select="itemsB">
      <fo:page-sequence master-reference="portrait">
        ...printed stuff...
      </fo:page-sequence>
    </xsl:for-each>
    

    You would not need the <fo:block break-before="page"> because the fo:page-sequence always generates a new page sequence.