(XSL-FO) Text einrücken mit relativen Werten
Julian von Mendel
- xml
Hi,
ich möchte mit XSL-FO/FOP einen Text einrücken. Im Moment setze ich dann einfach den margin-left auf z. B. 1cm. Wenn ich jetzt in diesem Bereich noch ein block-Element mit margin-left="1cm" erzeuge, ist dieses jedoch gleich weit eingerückt, da die Strecke absolut, nicht relativ ist. Wenn ich statt margin-left padding-left verwende geht garnichts mehr, wenn ich start-indent einsetze verhält es sich genauso wie mit margin-left. Was mache ich falsch?
Vielen Dank
Julian
Hallo,
ich möchte mit XSL-FO/FOP einen Text einrücken. Im Moment setze ich dann einfach den margin-left auf z. B. 1cm. Wenn ich jetzt in diesem Bereich noch ein block-Element mit margin-left="1cm" erzeuge, ist dieses jedoch gleich weit eingerückt, da die Strecke absolut, nicht relativ ist. Wenn ich statt margin-left padding-left verwende geht garnichts mehr, wenn ich start-indent einsetze verhält es sich genauso wie mit margin-left. Was mache ich falsch?
Welchen Prozessor verwendest du?
Grüße
Thomas
Hi,
ich möchte mit XSL-FO/FOP einen Text einrücken. Im Moment setze ich dann einfach den margin-left auf z. B. 1cm. Wenn ich jetzt in diesem Bereich noch ein block-Element mit margin-left="1cm" erzeuge, ist dieses jedoch gleich weit eingerückt, da die Strecke absolut, nicht relativ ist. Wenn ich statt margin-left padding-left verwende geht garnichts mehr, wenn ich start-indent einsetze verhält es sich genauso wie mit margin-left. Was mache ich falsch?
»
Welchen Prozessor verwendest du?
FOP von Apache. Hältst du es für einen Fehler von mir oder für einen Fehler im Prozessor?
Mein Code ist ganz einfach:
<xsl:template match="block">
<fo:block
<xsl:attribute name="margin-left"><xsl:value-of select="@indent" /></xsl:attribute>
<xsl:apply-templates />
</fo:block>
</xsl:template>
Schöne Grüße
Julian
Hallo Julian,
Welchen Prozessor verwendest du?
FOP von Apache. Hältst du es für einen Fehler von mir oder für einen Fehler im Prozessor?
FOP hat Probleme mit padding siehe http://xml.apache.org/fop/compliance.html
Mein Code ist ganz einfach:
<xsl:template match="block">
<fo:block
<xsl:attribute name="margin-left"><xsl:value-of select="@indent" /></xsl:attribute>
<xsl:apply-templates />
</fo:block>
</xsl:template>
Was ich dir empfehlen kann ist folgendes:
<xsl:template match="block">
<fo:block padding-left="{sum(ancestor::block/@indent)+1}cm" start-indent="{sum(ancestor::block/@indent)+1}cm">
<xsl:apply-templates />
</fo:block>
</xsl:template>
Das +1 ist notwendig, sonst sind die angaben es beim obersten <block> 0
Du kannst natürlich auch andere Angaben als cm verwenden (ich würde explizit pt empfehlen), aber dies ist natürlich auch der Nachteil, denn du kannst dies nut im XSL/FO und nicht im XML festlegen.
Grüße
Thomas
Testcode:
----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<data>
<block indent="1">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam tincidunt. Nulla sit amet urna in est gravida interdum. Aenean suscipit. Vestibulum
non augue. Vivamus luctus enim ac nunc adipiscing dictum. Nunc ac lorem eget dolor aliquam laoreet. Suspendisse potenti. Fusce urna. Nunc
congue, neque eu pharetra commodo, turpis dolor molestie erat, a adipiscing ipsum lacus a nisl.
<block indent="1">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam tincidunt. Nulla sit amet urna in est gravida interdum. Aenean suscipit. Vestibulum
non augue. Vivamus luctus enim ac nunc adipiscing dictum. Nunc ac lorem eget dolor aliquam laoreet. Suspendisse potenti. Fusce urna. Nunc
congue, neque eu pharetra commodo, turpis dolor molestie erat, a adipiscing ipsum lacus a nisl. Quisque eget elit. Morbi odio. Duis sit amet pede.
Vivamus sed enim in erat vehicula fringilla. Duis viverra. Nam condimentum, mi vel mollis vulputate, libero orci sodales urna, a tempor odio lectus
eget wisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam vestibulum tortor nec turpis.
Aenean suscipit adipiscing sem. Vivamus id felis. Praesent ornare malesuada tortor.
</block>
Quisque eget elit. Morbi odio. Duis sit amet pede.
Vivamus sed enim in erat vehicula fringilla. Duis viverra. Nam condimentum, mi vel mollis vulputate, libero orci sodales urna, a tempor odio lectus
eget wisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam vestibulum tortor nec turpis.
Aenean suscipit adipiscing sem. Vivamus id felis. Praesent ornare malesuada tortor.
</block>
</data>
---------------
<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" indent="yes"/>
<xsl:template match="/">
fo:root
fo:layout-master-set
<fo:simple-page-master master-name="meineSeite"
page-width="21cm"
page-height="29.7cm"
margin="2cm">
fo:region-body/
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="meineSeite">
<fo:static-content flow-name="xsl-region-after">
fo:block
fo:page-number/
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
xsl:apply-templates/
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="block">
<fo:block padding-left="{sum(ancestor::block/@indent)+1}cm" start-indent="{sum(ancestor::block/@indent)+1}cm">
<xsl:apply-templates />
</fo:block>
</xsl:template>
</xsl:stylesheet>
-----------------
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
fo:layout-master-set
<fo:simple-page-master master-name="meineSeite" page-width="21cm" page-height="29.7cm" margin="2cm">
fo:region-body/
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="meineSeite">
<fo:static-content flow-name="xsl-region-after">
fo:block
fo:page-number/
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block padding-left="1cm" start-indent="1cm">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam tincidunt. Nulla sit amet urna in est gravida interdum. Aenean suscipit. Vestibulum
non augue. Vivamus luctus enim ac nunc adipiscing dictum. Nunc ac lorem eget dolor aliquam laoreet. Suspendisse potenti. Fusce urna. Nunc
congue, neque eu pharetra commodo, turpis dolor molestie erat, a adipiscing ipsum lacus a nisl.
<fo:block padding-left="2cm" start-indent="2cm">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam tincidunt. Nulla sit amet urna in est gravida interdum. Aenean suscipit. Vestibulum
non augue. Vivamus luctus enim ac nunc adipiscing dictum. Nunc ac lorem eget dolor aliquam laoreet. Suspendisse potenti. Fusce urna. Nunc
congue, neque eu pharetra commodo, turpis dolor molestie erat, a adipiscing ipsum lacus a nisl. Quisque eget elit. Morbi odio. Duis sit amet pede.
Vivamus sed enim in erat vehicula fringilla. Duis viverra. Nam condimentum, mi vel mollis vulputate, libero orci sodales urna, a tempor odio lectus
eget wisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam vestibulum tortor nec turpis.
Aenean suscipit adipiscing sem. Vivamus id felis. Praesent ornare malesuada tortor.
</fo:block>
Quisque eget elit. Morbi odio. Duis sit amet pede.
Vivamus sed enim in erat vehicula fringilla. Duis viverra. Nam condimentum, mi vel mollis vulputate, libero orci sodales urna, a tempor odio lectus
eget wisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam vestibulum tortor nec turpis.
Aenean suscipit adipiscing sem. Vivamus id felis. Praesent ornare malesuada tortor.
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
...
wenn du
<fo:block padding-left="{sum(ancestor::block/@indent)+@indent}cm" start-indent="{sum(ancestor::block/@indent)+@indent}cm">
verwendets, brauchst du das +1 nicht.
Grüße
Thomas
Vielen Dank Thomas, du hast mir mal wieder sehr geholfen. XSL-FO ist ein blödes Thema, man findet deutsch eigentlich garkeine Doku im Netz und Englisch zwar viele Referenzen, aber die meisten sind zu unvollständig...
(ich würde explizit pt empfehlen)
Hat das irgendwelche besonderen Gründe? Wo ist denn da der Vorteil gegenüber z. B. mm?
Schöne Grüße
Julian
Hallo,
XSL-FO ist ein blödes Thema, man findet deutsch eigentlich garkeine Doku im Netz und Englisch zwar viele Referenzen, aber die meisten sind zu unvollständig...
Es bietet sich aber das IMHO empfehlenswerte Buch "XSL-FO in der Praxis" an. Die dort verlinkte PDF-Datei enthaelt bereits einen großen Teil der FO-Referenz.
MfG, Thomas
Hallo,
(ich würde explizit pt empfehlen)
Hat das irgendwelche besonderen Gründe? Wo ist denn da der Vorteil gegenüber z. B. mm?
Generell damit, dass wenn nicht anders angegeben, die Schrift im pt gerechnet wird. Da kann es dann dazukommen, dass bei anderen festen Angaben das Layout zerrissen wird und weil FO-PDF fürs Druck gedacht ist, ist es auch besser wenn pt verwendet wird (bis auf die Bestimmungen der Seitengröße).
Aber das ist nur (m)eine Empfehlung, wenn auch aus der Praxis ;-).
Grüße
Thomas