Julian von Mendel: (XSL-FO) Text einrücken mit relativen Werten

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

--
"Real programmers can write assembly code in any language." - Larry Wall
  1. 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

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. 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

      --
      "Real programmers can write assembly code in any language." - Larry Wall
      1. 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

        • only implemented for blocks
        • can't be used to make extra space (use indents + spaces instead)

        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>

        1. ...

          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

        2. 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

          --
          "Real programmers can write assembly code in any language." - Larry Wall
          1. 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

          2. 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