[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 455.   XSL-FO: contenuto

Il contenuto di una regione del corpo definita dall'impaginazione, è fatto sommariamente di blocchi, come l'elemento fo:block, e di componenti lineari, in base al contesto. Generalmente, un blocco non può essere contenuto in un contesto lineare, a meno che questo sia incorporato in un elemento apposito, come fo:inline-container.

Un blocco è idealmente un oggetto a due dimensioni, rettangolare, per il quale potrebbero essere previsti dei margini su tutti i lati; un componente lineare è invece inteso come un oggetto monodimensionale, che, se ha dei margini, questi possono riguardare soltanto uno spazio iniziale e finale.

In generale, gli elementi che descrivono un blocco o una componente lineare condividono delle opzioni comuni per definire i margini, il bordo, il colore di fondo e altre caratteristiche. La tabella 455.1 elenca alcuni attributi abbastanza comuni.

Tabella 455.1. Alcuni attributi abbastanza comuni negli elementi che contengono del testo, sia in forma di blocco, sia in forma lineare.

Attributo Descrizione
space-start="spazio_iniziale"
space-end="spazio_finale"
Riguarda i componenti lineari e richiede uno spazio iniziale o finale.
*before*="prima"
*after*="dopo"
*start*="inizio"
*end*="fine"
Un attributo che contiene le parole chiave evidenziate rappresenta una proprietà relativa alla posizione rispettiva, tenendo conto della direzione di scrittura.
space-before="spazio_prima"
space-after="spazio_dopo"
start-indent="rientro_iniziale"
end-indent="rientro_finale"
Riguarda i componenti a blocchi e definisce i margini.
border-before-color="colore"
border-after-color="colore"
border-start-color="colore"
border-end-color="colore"
Definisce il colore del bordo.
border-before-style="stile"
border-after-style="stile"
border-start-style="stile"
border-end-style="stile"
Definisce lo stile del bordo. Possono essere usate parole chiave come: none, dotted, dashed, solid, double.
border-before-width="spessore"
border-after-width="spessore"
border-start-width="spessore"
border-end-width="spessore"
Definisce lo spessore del bordo.
font-family="nome"
font-family="serif"\
  \|"sans-serif"|"cursive"|"fantasy"\
  \|"monospace"
Dichiara il nome di un carattere tipografico. Il nome può essere indicato in modo preciso, oppure attraverso parole chiave che si riferiscono alla caratteristica di massima.
font-size="altezza"
font-size="xx-small"|"x-small"|"small"\
  \|"medium"|"large"|"x-large"\
  \|"xx-large"
font-size="larger"|"smaller"
font-size="n%"
font-size="nem"
Dichiara la dimensione del carattere tipografico. La dimensione può essere data con un valore assoluto, espresso attraverso un numero e la sua unità di misura; un valore assoluto specificato attraverso una parola chiave; un valore relativo specificato attraverso una parola chiave; un valore relativo specificato in modo percentuale o in quadratoni («em»).
font-style="normal"|"italic"|"oblique"\
  \|"backslant"
Dichiara stile del carattere, inteso come la sua inclinazione o la sua forma corsiva.
font-stretch="ultra-condensed"\
  \|"extra-condensed"|"condensed"\
  \|"semi-condensed"|"normal"\
  \|"semi-expanded"|"expanded"\
  \|"extra-condensed"|"ultra-expanded"
Dichiara la larghezza del carattere.
font-variant="normal"|"small-caps"
Dichiara l'utilizzo o meno del maiuscoletto.
font-weight="normal"|"bold"|"bolder"\
  \|"lighter"
Dichiara lo spessore del carattere (normale, nero, nerissimo, chiaro).
line-height="normal"|"altezza"|"n"|"n%"
Dichiara l'altezza della riga. Se si indica un numero privo di unità di misura, si fa riferimento alla dimensione del carattere (n volte l'altezza del carattere); se si indica una percentuale, questa si riferisce all'altezza del carattere.
text-align="start"|"center"|"end"|"justify"|...
Riguarda i componenti a blocchi e serve per dichiarare l'allineamento da usare. Al posto di indicare un allineamento a destra o a sinistra, si preferiscono definizioni riferite alla direzione di scrittura.
text-indent="dimensione"|"n%"
Riguarda i componenti a blocchi e serve per dichiarare il rientro della prima riga. Un valore percentuale si riferisce all'ampiezza del blocco che lo contiene.

Questo capitolo non esaurisce l'argomento trattato, perché diversi elementi e molti attributi non vengono descritti affatto. Per ottenere le informazioni mancanti e in modo più dettagliato, si consulti la documentazione annotata nella bibliografia che appare alla fine.

455.1   Blocchi di testo comuni

Un blocco di testo comparabile all'elemento P di HTML, si ottiene con l'elemento fo:block, che però può contenere anche altri blocchi, oltre al testo lineare puro e semplice:

<fo:block
        [attributi]>
    ...
</fo:block>

L'esempio seguente mostra l'uso di alcuni attributi per modificare il linguaggio, per inserire dei bordi, per modificare il carattere e per inserire dei margini:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master          master-name="normale"
                page-width="210mm"      page-height="297mm"
                margin-top="2cm"        margin-bottom="2cm"
                margin-left="2cm"       margin-right="2cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence           master-reference="normale"
            language="it"       country="it">
        <fo:flow                flow-name="xsl-region-body">
            <fo:block   language="de"           country="de"
                        font-family="serif"     font-size="7mm"
                        border-before-style="solid"
                        border-after-style="solid">
                Wer bekommt das gr&#x00F6;&#x00DF;te St&#x00FC;ck Torte?
            </fo:block>
            <fo:block   font-style="italic"     font-size="7mm"
                        space-before="1cm"      space-after="1cm">
                Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla.
            </fo:block>
            <fo:block   font-size="7mm"
                        space-before="1cm"      space-after="1cm">
                Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla.
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Il risultato della composizione si può osservare nelle figura seguente:

esempio-005.fo

Dal momento che tutti gli elementi fo:block dell'esempio utilizzano un carattere di 7 mm, si può sfruttare l'ereditarietà della proprietà, inserendo tutti questi blocchi in un elemento fo:block complessivo (riga 15) in cui si dichiara una volta sola tale dimensione:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!DOCTYPE fo:root SYSTEM "fo.dtd">
      3 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      4     <fo:layout-master-set>
      5         <fo:simple-page-master          master-name="normale"
      6                 page-width="210mm"      page-height="297mm"
      7                 margin-top="2cm"        margin-bottom="2cm"
      8                 margin-left="2cm"       margin-right="2cm">
      9             <fo:region-body />
     10         </fo:simple-page-master>
     11     </fo:layout-master-set>
     12     <fo:page-sequence           master-reference="normale"
     13             language="it"       country="it">
     14         <fo:flow                flow-name="xsl-region-body">
     15             <fo:block           font-size="7mm">
     16                 <fo:block       language="de"           country="de"
     17                                 font-family="serif"     font-size="7mm"
     18                                 border-before-style="solid"
     19                                 border-after-style="solid">
     20                     Wer bekommt das gr&#x00F6;&#x00DF;te St&#x00FC;ck Torte?
     21                 </fo:block>
     22                 <fo:block       font-style="italic"
     23                                 space-before="1cm"      space-after="1cm">
     24                     Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
     25                     bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     26                     bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     27                     bla bla bla bla bla.
     28                 </fo:block>
     29                 <fo:block       space-before="1cm"      space-after="1cm">
     30                     Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
     31                     bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     32                     bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     33                     bla bla bla bla bla.
     34                 </fo:block>
     35             </fo:block>
     36         </fo:flow>
     37     </fo:page-sequence>
     38 </fo:root>

Il risultato che si ottiene è lo stesso già visto nella figura precedente.

455.2   Testo lineare

In un contesto lineare, si può inserire testo o elementi che non creano un blocco. In modo particolare, l'elemento fo:inline, con l'uso dei suoi attributi, consente di modificare le caratteristiche del testo, come il carattere, lo spostamento sulla linea di riferimento (apici e pedici) e il colore:

<fo:inline
        [font-family="nome"|"serif"|"sans-serif"|"cursive"|"fantasy"
            |"monospace"]
        [font-size="altezza"|"xx-small"|"x-small"|"small"|"medium"|"large"
            |"x-large"|"xx-large"|"larger"|"smaller"|"n%"|"nem"]
        [font-style="normal"|"italic"|"oblique"|"backslant"]
        [font-stretch="ultra-condensed"|"extra-condensed"|"condensed"
            |"semi-condensed"|"normal"|"semi-expanded"|"expanded"
            |"extra-condensed"|"ultra-expanded"]
        [font-variant="normal"|"small-caps"]
        [font-weight="normal"|"bold"|"bolder"|"lighter"]
        [baseline-shift="sub"|"super"|...]
        [color="colore"]
        [altri_attributi]>
    [contenuto_lineare]
</fo:inline>

L'esempio seguente mostra solo un estratto di un file XSL-FO, con un blocco che contiene testo lineare, all'interno del quale appaiono alcuni elementi fo:inline con lo scopo di modificare il carattere, il colore e lo spostamento verticale:

<fo:block>Bla bla bla <fo:inline font-style="italic">testo in
corsivo</fo:inline> bla bla bla <fo:inline
font-weight="bold">H<fo:inline
baseline-shift="sub">2</fo:inline>O</fo:inline> bla bla bla <fo:inline
font-family="monospace">ls -l | sort &gt; prova</fo:inline> bla bla bla
<fo:inline color="blue">testo in blu</fo:inline> bla bla bla <fo:inline
font-variant="small-caps">testo in maiuscoletto</fo:inline> bla bla
bla.</fo:block>

Nell'ambito di un contesto lineare, eccezionalmente, è possibile inserire un blocco, attraverso l'elemento fo:inline-container:

<fo:inline-container
        [width="ampiezza"]
        [altri_attributi]>
    [contenuto_blocco]
</fo:inline-container>

455.3   Elenchi

Gli elenchi sono definiti attraverso l'elemento fo:list-block, che è, evidentemente, un blocco:

<fo:list-block [attributi]>
    <fo:list-item [attributi]>
        <fo:list-item-label [attributi]>
            blocchi
        </fo:list-item-label>
        <fo:list-item-body [attributi]>
            blocchi
        </fo:list-item-body>
    <fo:/list-item>
    ...
</fo:list-block>

In pratica, l'elemento fo:list-block contiene obbligatoriamente elementi fo:list-item, i quali, a loro volta, contengono la coppia fo:list-item-label e fo:list-item-body. L'esempio seguente costruisce un elenco puntato molto semplice, dove i lembi che segnalano l'inizio di ogni punto sono costituiti da un asterisco:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master          master-name="normale"
                page-width="210mm"      page-height="297mm"
                margin-top="2cm"        margin-bottom="2cm"
                margin-left="2cm"       margin-right="2cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence           master-reference="normale"
            language="it"       country="it">
        <fo:flow                flow-name="xsl-region-body">
            <fo:block           font-size="7mm">
                <fo:block       space-after="1cm">
                    Un elenco puntato:
                </fo:block>
                <fo:list-block  space-after="1cm">
                    <fo:list-item>
                        <fo:list-item-label>
                            <fo:block>*</fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block>Uno</fo:block>
                        </fo:list-item-body>
                    </fo:list-item>             
                    <fo:list-item>
                        <fo:list-item-label>
                            <fo:block>*</fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block>
                                Due. Bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla.
                            </fo:block>
                            <fo:block>
                                Bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla.
                            </fo:block>
                        </fo:list-item-body>
                    </fo:list-item>             
                    <fo:list-item>
                        <fo:list-item-label>
                            <fo:block>*</fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block>Tre</fo:block>
                        </fo:list-item-body>
                    </fo:list-item>             
                </fo:list-block>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Tuttavia, se si esegue la composizione si può osservare che gli asterischi si trovano a essere sovrapposti al corpo delle voci:

esempio-007.fo

Per evitare che ciò accada, è necessario intervenire con dei rientri appropriati, utilizzando gli attributi dei blocchi che sono contenuti, sia come etichette, sia come corpo delle voci elencate. Per la precisione, si usa l'attributo end-indent nei blocchi delle etichette e l'attributo start-indent nei blocchi del corpo. Per fare in modo che queste distanze vengano calcolate automaticamente, si usano delle funzioni interne a XSL-FO, in grado di restituire il valore appropriato al contesto. Si tratta rispettivamente di label-end() e di body-start(). Pertanto, l'esempio va modificato come segue:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master          master-name="normale"
                page-width="210mm"      page-height="297mm"
                margin-top="2cm"        margin-bottom="2cm"
                margin-left="2cm"       margin-right="2cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence           master-reference="normale"
            language="it"       country="it">
        <fo:flow                flow-name="xsl-region-body">
            <fo:block           font-size="7mm">
                <fo:block       space-after="1cm">
                    Un elenco puntato:
                </fo:block>
                <fo:list-block  space-after="1cm">
                    <fo:list-item>
                        <fo:list-item-label>
                            <fo:block end-indent="label-end()">*</fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block start-indent="body-start()">Uno</fo:block>
                        </fo:list-item-body>
                    </fo:list-item>             
                    <fo:list-item>
                        <fo:list-item-label>
                            <fo:block end-indent="label-end()">*</fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block start-indent="body-start()">
                                Due. Bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla.
                            </fo:block>
                            <fo:block start-indent="body-start()">
                                Bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla bla bla bla bla bla bla bla
                                bla bla bla.
                            </fo:block>
                        </fo:list-item-body>
                    </fo:list-item>             
                    <fo:list-item>
                        <fo:list-item-label>
                            <fo:block end-indent="label-end()">*</fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block start-indent="body-start()">Tre</fo:block>
                        </fo:list-item-body>
                    </fo:list-item>             
                </fo:list-block>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Questa volta il risultato della composizione è corretto:

esempio-008.fo

455.4   Tabelle

Come si può immaginare, la realizzazione di una tabella con XSL-FO è un'operazione abbastanza complessa, anche nelle situazioni più semplici:

<fo:table-and-caption [attributi]>
    [<fo:table-caption [attributi]>
        blocchi
    </fo:table-caption>]
    <fo:table
            [table-layout="auto"..."fixed"]
            [altri_attributi]>
        [<fo:table-column
                [table-column="ampiezza"]
                [attributi] />]
        ...
        [<fo:table-header [attributi]>
            righe
        </fo:table-header>]
        [<fo:table-footer [attributi]>
            righe
        </fo:table-footer>]
        <fo:table-body [attributi]>
            righe
        </fo:table-body>
    </fo:table-caption>
</fo:table-and-caption>

Il significato dei vari elementi che appaiono nel modello sintattico dovrebbe essere intuitivo; si osservi in particolare che una tabella si può realizzare anche partendo soltanto dall'elemento fo:table, quando non è importante l'inserimento di una didascalia con l'elemento fo:table-caption. Le righe interne all'intestazione, al piè di pagina e al corpo, vengono inserite nel modo seguente:

<fo:table-row [attributi]>
    <fo:table-cell [attributi]>
        blocchi
    </fo:table-cell>
</fo:table-row>

L'ampiezza delle colonne, i bordi e altre caratteristiche della tabella vengono gestiti attraverso gli attributi. Teoricamente, l'elemento fo:table dispone dell'attributo table-layout, con il quale si potrebbe richiedere un adattamento automatico della larghezza delle colonne; in pratica questa funzionalità è abbastanza difficile da trovare, pertanto si è costretti a usare l'attributo column-width degli elementi fo:table-column.

L'esempio seguente mostra una tabella molto semplice e anche molto povera, perché manca qualunque bordo e perché viene definita senza l'elemento fo:table-and-caption, in modo da garantire il funzionamento con le prime edizioni di FOP:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master          master-name="normale"
                page-width="210mm"      page-height="297mm"
                margin-top="2cm"        margin-bottom="2cm"
                margin-left="2cm"       margin-right="2cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence           master-reference="normale"
            language="it"       country="it">
        <fo:flow                flow-name="xsl-region-body">
            <fo:block           font-size="7mm">
                <fo:block>Tabella di esempio. Bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla</fo:block>
                <fo:table table-layout="fixed">
                    <fo:table-column column-width="5cm" />
                    <fo:table-column column-width="7cm" />
                    <fo:table-column column-width="5cm" />
                    <fo:table-header>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    Parola di controllo
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Competenza
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Condizione o valore predefinito
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                    </fo:table-header>
                    <fo:table-body>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    \hoffset
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Posizione iniziale dei paragrafi nella
                                    pagina.
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    0
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    \hsize
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Larghezza del paragrafo a partire da
                                    \hoffset.
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    6,5 pollici
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    \parindent
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Rientro della prima riga.
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    20 punti
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    \baselineskip
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Distanza tra la base di una riga e la
                                    base della riga successiva.
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    12 punti
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    \parskip
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Distanza aggiuntiva tra i paragrafi.
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    0
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    \raggedright
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    Allinea il testo a sinistra.
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    allineato simultaneamente a sinistra e
                                    a destra
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                    </fo:table-body>
                </fo:table>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Ecco il risultato:

esempio-010.fo

Per introdurre dei bordi, almeno teoricamente, si può intervenire dal blocco contenuto nella singola cella, fino all'elemento fo:table più esterno; tuttavia, a seconda del programma di elaborazione che si utilizza, può darsi che in alcuni punti i bordi non vengano presi in considerazione.

455.5   Inserzione di immagini

L'inserzione di un'immagine si ottiene con l'elemento fo:external-graphic, che è vuoto e appartiene a un contesto lineare:

<fo:external-graphic>
        src="file"|"indirizzo_uri"
        [scaling="uniform"|"non-uniform"]
        [height="auto"|"altezza]
        [width="auto"|"larghezza]
        [altri_attributi] />

Se non si indicano delle dimensioni attraverso gli attributi height o width, l'immagine viene inserita alla sua dimensione naturale. Se si modifica una sola dimensione, normalmente si ottiene l'adattamento dell'altro valore in modo relativo; tuttavia, attraverso l'opzione scaling="non-uniform", è possibile deformare l'immagine.

Il file o l'indirizzo URI dell'immagine deve fare riferimento a un formato compatibile con le capacità elaborative del sistema usato per la composizione. Di solito vanno bene almeno i formati GIF e JPG.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master          master-name="normale"
                page-width="210mm"      page-height="297mm"
                margin-top="2cm"        margin-bottom="2cm"
                margin-left="2cm"       margin-right="2cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence           master-reference="normale"
            language="it"       country="it">
        <fo:flow                flow-name="xsl-region-body">
            <fo:block           font-size="7mm">
                <fo:block>
                    Ecco una figura al naturale:
                </fo:block>
                <fo:block>
                    <fo:external-graphic
                            src="esempio.jpg" />
                </fo:block>
                <fo:block>
                    La prossima figura &#x00E8; larga 7 cm ed &#x00E8;
                    collocata al centro:
                </fo:block>
                <fo:block   text-align="center">
                    <fo:external-graphic
                            src="esempio.jpg"
                            scaling="uniform"
                            width="7cm" />
                </fo:block>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

L'esempio mostra l'inserzione della stessa immagine due volte, in modi differenti. In particolare, la seconda volta l'immagine viene centrata orizzontalmente per mezzo dell'attributo text-align dell'elemento fo:block che la contiene.

esempio-011.fo

455.6   Linee orizzontali

Si può realizzare facilmente una linea orizzontale con un elemento fo:block bordato, magari anche vuoto:

<fo:block
        border-after-style="stile"
        [border-after-width="spessore"]
        [border-after-color="colore"]
        [altri_attributi] />

Per inserire delle linee orizzontali in un contesto lineare, ovvero all'interno del testo, si usa l'elemento fo:leader:

<fo:leader
        leader-pattern="use-content"
        [leader-length="lunghezza"]
        [altri_attributi]>
    modello
</fo:leader>
<fo:leader
        leader-pattern="space"|"rule"|"dots"
        [leader-length="lunghezza"]
        [rule-style="stile"]
        [rule-thickness="spessore"]
        [altri_attributi] />

Se l'elemento contiene qualcosa e all'attributo leader-pattern viene associato il valore use-content, questo viene usato per costruire la linea (per esempio si potrebbe realizzare una linea fatta di asterischi o di sequenze più complesse). Tuttavia, di solito si vogliono realizzare soltanto linee continue, spezzate o puntate, pertanto l'elemento si usa prevalentemente vuoto.

È importante osservare che la linea che si ottiene raggiunge la fine dello spazio orizzontale disponibile, pertanto, per realizzare linee di collegamento come quelle degli indici, dove appare un titolo alla sinistra e un numero di pagina alla destra, occorre inserire tutto in una tabella. Nell'esempio seguente vengono mostrati diversi casi, compresa la simulazione di un indice elementare, inserito in una tabella:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master          master-name="normale"
                page-width="210mm"      page-height="297mm"
                margin-top="2cm"        margin-bottom="2cm"
                margin-left="2cm"       margin-right="2cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence           master-reference="normale"
            language="it"       country="it">
        <fo:flow                flow-name="xsl-region-body">
            <fo:block           font-size="7mm">
                <fo:block>
                    Bla bla bla bla bla bla bla bla bla bla bla bla bla
                    bla bla bla bla bla bla bla bla bla bla bla bla bla
                    bla bla bla bla bla bla bla bla bla.
                </fo:block>
                <fo:block>
                    La linea orizzontale successiva &#x00E8; ottenuta
                    con un bordo a un elemento fo:block vuoto:
                </fo:block>
                <fo:block
                        border-after-style="solid"
                        border-after-width="3mm"
                        border-after-color="black" />
                <fo:block>
                    La linea orizzontale successiva &#x00E8; ottenuta
                    con un elemento fo:leader:
                </fo:block>
                <fo:block>
                    <fo:leader
                            leader-pattern="rule"
                            rule-style="solid"
                            rule-thickness="1mm"
                            color="blue"/>
                </fo:block>
                <fo:block>
                    L'esempio successivo mostra che con fo:leader la
                    linea parte dalla posizione orizzontale corrente e
                    raggiunge la fine della riga:
                </fo:block>
                <fo:block>
                    Bla bla bla:
                    <fo:leader
                            leader-alignment="reference-area"
                            leader-pattern="dots"
                            rule-style="solid"
                            rule-thickness="1mm"
                            color="blue"/>
                    bla bla bla.
                </fo:block>
                <fo:block>
                    &#x00C8; necessario usare una tabella
                    per usare le linee allo scopo di unire del testo in
                    modo ordinato, come si fa con gli indici:
                </fo:block>
                <fo:table   table-layout="fixed">
                    <fo:table-column column-width="16cm"/>
                    <fo:table-column column-width="1cm"/>
                    <fo:table-body>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    Esempio di un titolo a pagina:
                                    <fo:leader
                                            leader-pattern="dots"
                                            rule-style="solid"
                                            rule-thickness="1mm"
                                        color="blue"/>
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    1
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>
                                    Un altro titolo a pagina:
                                    <fo:leader
                                            leader-pattern="dots"
                                            rule-style="solid"
                                            rule-thickness="1mm"
                                        color="blue"/>
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    20
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                    </fo:table-body>
                </fo:table>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Ecco il risultato della composizione dell'esempio:

esempio-011.fo

455.7   Riferimenti incrociati

XSL-FO ha una gestione molto sofisticata dei riferimenti ipertestuali; tuttavia, qui si vuole mostrare solo l'uso più semplice. In generale, la maggior parte degli elementi può contenere l'attributo id, con lo scopo di associare una stringa di identificazione univoca, in modo da consentire successivamente di raggiungere il contenuto di questi elementi attraverso un riferimento interno.

Per fare riferimento a qualcosa, si usa l'elemento fo:basic-link (nell'ambito di un contesto lineare), specificando se si tratta di un riferimento interno o esterno, con l'uso alternativo degli attributi internal-destination e external-destination:

<fo:basic-link
        {internal-destination="stringa_id"}|{external-destination="indirizzo_uri"}
        [altri_attributi]>
    contenuto
</fo:basic-link>

Il testo contenuto nell'elemento serve per individuare la zona su cui funziona la selezione del riferimento, come nell'esempio seguente, dove la parola «qui» serve come superficie su cui fare un clic con il mouse:

Per raggiungere il sito, basta fare un clic <fo:basic-link
external-destination="http://www.brot.dg">qui</fo:basic-link>.

Per fare riferimento a una pagina, in modo da ottenerne il numero nella composizione stampata, si usano due elementi per due situazioni differenti:

<fo:page-number [attributi] />
<fo:page-number-citation
        ref-id="stringa_a_cui_si_fa_riferimento"
        [attributi] />

Nel primo caso, si ottiene il numero della pagina corrente; nel secondo, si ottiene il numero di pagina a cui si fa riferimento con la stringa indicata con l'attributo ref-id. L'esempio seguente riassume l'uso di questi elementi, dove in particolare si inserisce il numero di pagina nella regione inferiore:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master
                master-name="normale"
                page-width="210mm"
                page-height="297mm"
                margin-top="2cm"
                margin-bottom="2cm"
                margin-left="2cm"
                margin-right="2cm">
            <fo:region-body   margin-top="1cm" margin-bottom="1cm"/>
            <fo:region-before extent="1cm" />
            <fo:region-after  extent="1cm" />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence
            master-reference="normale"
            initial-page-number="1"
            force-page-count="even"
            language="it"
            country="it">
        <fo:static-content flow-name="xsl-region-before">
            <fo:block   font-size="7mm">
                Riga di intestazione.
            </fo:block>
        </fo:static-content>
        <fo:static-content flow-name="xsl-region-after">
            <fo:block   font-size="7mm">
                pagina <fo:page-number />
            </fo:block>
        </fo:static-content>
        <fo:flow flow-name="xsl-region-body">
            <fo:block   font-size="7mm">
                <fo:block id="riferimento">
                    Qui &#x00E8; inserita un'ancora a cui si pu&#x00F2;
                    fare riferimento.
                </fo:block>
                <fo:block>
                    Bla bla bla bla bla bla bla bla bla bla bla bla bla
                    bla bla bla bla bla bla bla bla bla bla bla bla bla
                    bla bla bla bla bla bla bla bla bla bla bla bla bla
                    bla bla bla bla bla bla.
                </fo:block>
                <!-- Inserire qui altri fo:block per ottenere piu` pagine -->
                <fo:block>
                    Il riferimento che ci interessa si trova nella
                    <fo:basic-link
                    internal-destination="riferimento">pagina
                    <fo:page-number-citation
                    ref-id="riferimento"/></fo:basic-link>. Per il resto
                    <fo:basic-link
                    external-destination="http://www.brot.dg">si
                    pu&#x00F2; raggiungere il sito
                    http://www.brot.dg</fo:basic-link>.
                </fo:block>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Ecco come potrebbe apparire il risultato della composizione:

esempio-015.foesempio-015.fo

455.8   Componenti autonomi rispetto al testo

Esistono due tipi di componenti che, nella composizione, non si collocano nella posizione in cui appaiono nel corso del documento. Si tratta di note a piè pagina e di oggetti fluttuanti. Le note a piè pagina si inseriscono nell'ambito di un contesto lineare e si ottengono con questa sintassi:

<fo:footnote>
    <fo:inline [attributi]>
        simbolo
    </fo:inline>
    <fo:footnote-body>
        blocchi
    </fo:footnote-body>
</fo:footnote>

In pratica, l'elemento fo:footnote contiene necessariamente un elemento fo:inline, il cui scopo è quello di inserire un simbolo o qualunque cosa serva per rinviare il lettore alla nota a piè pagina; subito dopo, l'elemento fo:footnote-body contiene uno o più blocchi che contengono la nota vera e propria. Si tenga in considerazione il fatto che, probabilmente, si vuole inserire all'inizio delle note lo stesso simbolo usato per il richiamo.

<fo:block>
    Bla bla bla bla bla bla bla bla bla bla bla bla bla.
    <fo:footnote>
        <fo:inline>**</fo:inline>
        <fo:footnote-body>
            <fo:block>
                **) Ovviamente, questa &#x00E8; una
                frase senza senso.
            </fo:block>
        </fo:footnote-body>
    </fo:footnote>
    Bla bla bla bla bla bla bla bla bla bla bla bla bla.
    Bla bla bla bla bla bla bla bla bla bla bla bla bla.
</fo:block>

L'esempio mostra solo una porzione di un file XSL-FO, che, nella composizione finale potrebbe apparire in modo simile a questo:

esempio-011.fo

Gli oggetti fluttuanti si inseriscono all'interno dell'elemento fo:float, che si comporta come un blocco:

<fo:float
        float="before"|"start"|"end"|...
        [clear="posizione"]>
    blocchi
</fo:float>

In pratica, con l'aiuto dell'attributo float si può stabilire in che modo debba essere collocato l'oggetto fluttuante, mentre l'attributo clear serve a definire un comportamento in prossimità di altri oggetti fluttuanti.

Non vengono mostrati esempi sull'uso di questo elemento, anche se si può intuire la sua importanza in presenza di immagini e piccole tabelle che è bene collocare in modo dinamico nel corpo di un documento.

455.9   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome xsl_fo_contenuto.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!