Avatar billede bearhugx Nybegynder
07. august 2002 - 18:38 Der er 10 kommentarer og
1 løsning

Anvende CSS lignende classer i forbindelse med XSL/FO

Hej eksperter...

Jeg er igang med at lave et Formating Object (FO).. Rimligt tit skal jeg bruge den samme font-definition igen og igen - er det muligt i XSL/FO at lave en CSS-class eller lignende, så jeg istedet kan referere til classen...

det vil nemlig være nemmere at skrive
  <fo:block class="courier">...</fo:block>
end
  <fo:block font-size="12pt"
    font-family="courier"
    line-height="15pt"
    space-after.optimum="3pt"
    text-align="justify">...</fo:block>
hver gang man skal skifte font....

(i vores tilfælde skal der skiftes font/style 191 gange pr side, men der er kun brug for 4 "class"-definitioner)


Eller er der en anden - mere simpel måde, at jeg kan gøre det på...

/Søren Munk Skrøder
Avatar billede Slettet bruger
07. august 2002 - 21:34 #1
Har ikke rigtigt check på XSL-FO, men hvis ovenstående genereres vha. XSLT kan du benytte "attribute-sets":

<xsl:attribute-set name="courier">
  <xsl:attribute name="font-size">12pt</xsl:attribute>
  <xsl:attribute name="font-family">courier</xsl:attribute>
  <xsl:attribute name="line-height">15pt</xsl:attribute>
  <xsl:attribute name="space-after.optimum">3pt</xsl:attribute>
  <xsl:attribute name="text-align">justify</xsl:attribute>
</xsl:attribute-set>

- og angive flg. i templaten:

<fo:block use-attribute-sets="courier">...</fo:block>

/CS
Avatar billede Slettet bruger
07. august 2002 - 21:35 #2
Ups, ment som et svar - og for at det virker, skal der naturligvis et namespace-prefix på attributten:

<fo:block xsl:use-attribute-sets="courier">...</fo:block>

/CS
Avatar billede bearhugx Nybegynder
07. august 2002 - 22:29 #3
Hmm.. det virkede ikke...

output :
D:\Dev\Java\Extensions\FOP>java -cp build\fop.jar;lib\batik.jar;lib\xalan-2.0.0.jar;lib\xerces-1.2.3.jar;lib\avalon-framework-4.0.jar;lib\logkit-1.0.jar;lib\jimi-1.0.jar org.apache.fop.apps.Fop -c conf\userconfig.xml simple.fo sim.pdf   
[INFO]: FOP 0.20.3
[INFO]: building formatting object tree
[ERROR]: Unknown formatting object http://www.w3.org/1999/XSL/Transform^attribute-set
[ERROR]: Unknown formatting object http://www.w3.org/1999/XSL/Transform^attribute
[ERROR]: property 'xsl:use-attribute-sets' ignored
[ERROR]: property 'xsl:use-attribute-sets' ignored
[ERROR]: property 'xsl:use-attribute-sets' ignored
[INFO]: [1]
[INFO]: Parsing of document complete, stopping renderer

.fo-filen ser således ud :


<?xml version="1.0" encoding="utf-8"?>
<fo:root
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="simple"
            page-height="29.7cm"
            page-width="21cm"
            margin-top="1cm"
            margin-bottom="2cm"
            margin-left="2.5cm"
            margin-right="2.5cm">
            <fo:region-body margin-top="3cm"/>
            <fo:region-before extent="3cm"/>
            <fo:region-after extent="1.5cm"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
   
    <xsl:attribute-set name="header">
        <xsl:attribute name="font-size">18pt</xsl:attribute>
        <xsl:attribute name="font-family">courier</xsl:attribute>
        <xsl:attribute name="line-height">24pt</xsl:attribute>
        <xsl:attribute name="space-after.optimum">15pt</xsl:attribute>
        <xsl:attribute name="text-align">center</xsl:attribute>
        <xsl:attribute name="background-color">blue</xsl:attribute>
        <xsl:attribute name="color">white</xsl:attribute>   
    </xsl:attribute-set>

    <xsl:attribute-set name="normal">
        <xsl:attribute name="font-size">12pt</xsl:attribute>
        <xsl:attribute name="font-family">courier</xsl:attribute>
        <xsl:attribute name="line-height">15pt</xsl:attribute>
        <xsl:attribute name="space-after.optimum">3pt</xsl:attribute>
        <xsl:attribute name="text-align">left</xsl:attribute>
    </xsl:attribute-set>
   
    <fo:page-sequence master-reference="simple">
        <fo:flow flow-name="xsl-region-body">
            <fo:block xsl:use-attribute-sets="header">
                TEST
            </fo:block>

            <fo:block xsl:use-attribute-sets="normal">
                Et afsnit for sig selv....
            </fo:block>

            <fo:block xsl:use-attribute-sets="normal">
                Et andet afsnit.... bla, bla, bla...
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>
Avatar billede bearhugx Nybegynder
07. august 2002 - 22:38 #4
Måske jeg skulle jeg først sende xml-filen igennem en XSL transformation, hvor alle
  <fo:block class="courier">...</fo:block>
bliver translateret/transformateret til
  <fo:block {alle attributterne}>...</fo:block>

Lige som en makro ... Er det muligt egenligt ????


/Søren Munk Skrøder
Avatar billede Slettet bruger
07. august 2002 - 22:43 #5
Det var faktisk det jeg mente, ja. (Men det kræver jo lidt kendskab til XSLT - har du det?)

/CS
Avatar billede bearhugx Nybegynder
07. august 2002 - 22:49 #6
Det er _Meget_ basal viden om XSLT....

Hvis du er haj til det, så må du gerne give et eksempel .. Det ville jeg været meget glad for...
Avatar billede Slettet bruger
07. august 2002 - 22:56 #7
"fo.xml" fil:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="fo.xsl" ?>
<fo:root
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="simple"
            page-height="29.7cm"
            page-width="21cm"
            margin-top="1cm"
            margin-bottom="2cm"
            margin-left="2.5cm"
            margin-right="2.5cm">
            <fo:region-body margin-top="3cm"/>
            <fo:region-before extent="3cm"/>
            <fo:region-after extent="1.5cm"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
   
    <fo:page-sequence master-reference="simple">
        <fo:flow flow-name="xsl-region-body">
            <fo:block class="header">
                TEST
            </fo:block>

            <fo:block class="normal">
                Et afsnit for sig selv....
            </fo:block>

            <fo:block class="normal">
                Et andet afsnit.... bla, bla, bla...
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>


"fo.xsl" stylesheet:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
>
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

    <xsl:attribute-set name="header">
        <xsl:attribute name="font-size">18pt</xsl:attribute>
        <xsl:attribute name="font-family">courier</xsl:attribute>
        <xsl:attribute name="line-height">24pt</xsl:attribute>
        <xsl:attribute name="space-after.optimum">15pt</xsl:attribute>
        <xsl:attribute name="text-align">center</xsl:attribute>
        <xsl:attribute name="background-color">blue</xsl:attribute>
        <xsl:attribute name="color">white</xsl:attribute>   
    </xsl:attribute-set>

    <xsl:attribute-set name="normal">
        <xsl:attribute name="font-size">12pt</xsl:attribute>
        <xsl:attribute name="font-family">courier</xsl:attribute>
        <xsl:attribute name="line-height">15pt</xsl:attribute>
        <xsl:attribute name="space-after.optimum">3pt</xsl:attribute>
        <xsl:attribute name="text-align">left</xsl:attribute>
    </xsl:attribute-set>
   
    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>
   
    <xsl:template match="fo:* | @fo:* | @*">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
   
    <xsl:template match="fo:block[@class='header']">
        <fo:block xsl:use-attribute-sets="header">
            <xsl:apply-templates />
        </fo:block>
    </xsl:template>
   
    <xsl:template match="fo:block[@class='normal']">
        <fo:block xsl:use-attribute-sets="normal">
            <xsl:apply-templates />
        </fo:block>
    </xsl:template>
</xsl:stylesheet>

/CS
Avatar billede bearhugx Nybegynder
08. august 2002 - 00:05 #8
Hmm.. jeg kan simpelthen ikke få det til at virke... Det virker som om at når xml/fo-filen bliver sendt til FOP, at den så ikke har været XSLT-processeret endnu ???

Ærgeligt, for hvis jeg køre XSL-transformationen igennem XMLSpy så får jeg

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master>
<fo:region-body>
</fo:region-body>
<fo:region-before>
</fo:region-before>
<fo:region-after>
</fo:region-after>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence>
<fo:flow>
<fo:block font-size="18pt" font-family="courier" line-height="24pt" space-after.optimum="15pt" text-align="center" background-color="blue" color="white">
                TEST
            </fo:block>
<fo:block font-size="12pt" font-family="courier" line-height="15pt" space-after.optimum="3pt" text-align="left">
                Et afsnit for sig selv....
            </fo:block>
<fo:block font-size="12pt" font-family="courier" line-height="15pt" space-after.optimum="3pt" text-align="left">
                Et andet afsnit.... bla, bla, bla...
            </fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

Og der er der sket en substitution --- Men samtidig er alle oprindelige attributter i xml/fo filen fjernet (f.eks. side-opsætningen i simple-page-master)

Hvis jeg bare kunne finde ud af at lade xsl-transformationen ske, før den bliver gennemlæst af FOP

/Søren...

PS : Der er ekstra points, for dem, som kan hjælpe :-)
Avatar billede Slettet bruger
08. august 2002 - 01:07 #9
Hej igen

Får at få de originale attributter med ved transformationen, skal du bruge denne her (istedet for den eksisterende template):

<xsl:template match="fo:* | @fo:* | @*">
  <xsl:copy>
      <xsl:apply-templates select="* | fo:* | @* | @fo:*" />
  </xsl:copy>
</xsl:template>

Microsoft har en kommandolinje parser eet eller andet sted på http://msdn.microsoft.com/xml/ som du evt. kan benytte dig af i f.eks. en BAT-fil, alá (pseudo-kode - kender ikke eksakt syntax):

xslt.exe fo.xml fo.xsl resultat.xml
fop.exe resultat.xml document.pdf

(Hvis "fop.exe" altså laver PDF-filer...)

/CS
Avatar billede bearhugx Nybegynder
08. august 2002 - 02:08 #10
FOP er Apache's Formating Objects Processor (xml.apache.org/fop) - en pakke til at lave xml (i form af FO) til forskellige dokument-typer, bl.a. PDF, PS eller SVG-grafik

Med dine modifikationer har jeg fået det til at virke !!!!!

Jeg havde ikke opdaget at FOP faktisk har en kommando for at tage et XSL-dokument med...

i stedet for
  FOP foo.fo foo.pdf
skal man så skrive
  FOP -xsl foo.xsl -xml foo.xml -pdf foo.pdf

Lidt mere skrivearbejde --- MEN DET VIRKER !!! - og meget passende kan FO-oplysnigerne omkring skrift-typografi og side-opsætning nu føres ud i et XSL-dokument - så XML / FO -filen kun indeholder selve dataene !!! *SUPER!*

Der er lige kommet en ekstra belønning med til dig, greystate, for det her har lige reddet min dag :-))))

/Søren Munk Skrøder
Avatar billede Slettet bruger
08. august 2002 - 02:22 #11
Takker - glæder mig; Always a pleasure... :-)

/CS
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester