MudGuard: /FOP: region-start margin zeigt keine Wirkung

Hi,

Bei folgendem Code

  
<?xml version="1.0"?>  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
                xmlns:fo="http://www.w3.org/1999/XSL/Format"  
                version='1.0'>  
   <xsl:output method="xml" indent="no"/>  
   <xsl:template match="/root">  
      <fo:root>  
         <fo:layout-master-set>  
            <fo:simple-page-master  
                  master-name="seite"  
                  page-width    = "210mm"  
                  page-height   = "297mm"  
                  margin-left   =   "5mm"  
                  margin-right  =  "15mm"  
                  margin-top    =  "10mm"  
                  margin-bottom =  "20mm" >  
               <fo:region-body background-color="red" />  
               <fo:region-start  background-color="yellow"  
                     extent="8mm"  
                     margin-right="5mm" />  
            </fo:simple-page-master>  
         </fo:layout-master-set>  
         <xsl:apply-templates/>  
      </fo:root>  
   </xsl:template>  
  
   <xsl:template match="elem">  
      <fo:page-sequence master-reference="seite">  
         <fo:static-content flow-name="xsl-region-start">  
            <fo:block><fo:inline>s t a r t</fo:inline></fo:block>  
         </fo:static-content>  
         <fo:flow flow-name="xsl-region-body">  
            <fo:block>TEST</fo:block>  
         </fo:flow>  
      </fo:page-sequence>  
   </xsl:template>  
</xsl:stylesheet>  

erwarte ich eigentlich, daß zwischen dem gelben Randbereich und dem roten body-Bereich 5mm Abstand sind.
Tatsächlich klebt mir fop (0.20.5) die beiden Bereiche direkt aneinander.

Funktioniert margin bei region-start etwa nicht?
Laut Buch "XSL Das Einsteigerseminar" müßte es eigentlich funktionieren, Zitat: "Mit dem Attribut extent bestimmen Sie die Höhe [...] der Region. Zusätzlich haben sie die Möglichkeit, Angaben zu margin (Rand) [...] zu machen.

Setze ich statt margin-right einen Wert für padding-right, wird dieser auch beachtet (hat aber nicht die gewünschte Wirkung, da zwar der Inhalt des Randstreifens schmäler wird, nicht aber der eingefärbte Bereich).

Gebe ich statt für region margin-right="5mm" bei region-body margin-left="5mm" an, geschieht noch seltsameres - das wird nicht ignoriert, sondern führt dazu, daß das "T" von "TEST" verschwindet.

Was mache ich falsch?

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter
O o ostern ...
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  1. Tach MudGuard,

    Was mache ich falsch?

    Das Attribut extent legt für region-start bzw. region-end die Breite und für region-before bzw. region-after die Höhe fest. Dagegen existieren margin sowie margin-top|right|bottom|left bei den Regionen nur für region-body.

    Versuche also die Relationen mit margin und padding (haben alle Regionen) anders zu beschreiben.

    Man liest sich,
    svg4you

  2. Hallo Andreas,

    Du hättest ja gleich im Titel schreiben können "Thomas, was soll das?" ;-)

    Funktioniert margin bei region-start etwa nicht?

    Nein

    Laut Buch "XSL Das Einsteigerseminar" müßte es eigentlich funktionieren, Zitat: "Mit dem Attribut extent bestimmen Sie die Höhe [...] der Region. Zusätzlich haben sie die Möglichkeit, Angaben zu margin (Rand) [...] zu machen.

    *hui!* Die zwei Absätze sind dort tatsächlich fehlerhaft (sorry, ist mir wirklich peinlich).
    margin-* gibts nur für region-body, aber nicht für die anderen Regionen.

    Grüße
    Thomas

    1. Hi,

      sorry daß ich erst jetzt antworte, ich mußte erst 1100g Maronen aus dem Wald befreien ...

      Du hättest ja gleich im Titel schreiben können "Thomas, was soll das?" ;-)

      Nö. Da ich ja nicht wußte, ob der Fehler im Buch, im FOP oder in meinem Code liegt.

      Funktioniert margin bei region-start etwa nicht?
      Nein

      Ok.

      Laut Buch "XSL Das Einsteigerseminar" müßte es eigentlich funktionieren, Zitat: "Mit dem Attribut extent bestimmen Sie die Höhe [...] der Region. Zusätzlich haben sie die Möglichkeit, Angaben zu margin (Rand) [...] zu machen.
      *hui!* Die zwei Absätze sind dort tatsächlich fehlerhaft (sorry, ist mir wirklich peinlich).

      Da Du (zumindest nach meinem Wissensstand) nicht der Papst bist, bist Du nicht unfehlbar. Fehler können passieren. Selbst mir ...

      margin-* gibts nur für region-body, aber nicht für die anderen Regionen.

      Ok. Bleibt das Problem, das der margin bei body die seltsame Auswirkung hat, scheinbar negativ zu wirken, weil region-body bei margin-left="5mm" unter region-start verschwindet ...

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Tach MudGuard,

        Ok. Bleibt das Problem, das der margin bei body die seltsame Auswirkung hat, scheinbar negativ zu wirken, weil region-body bei margin-left="5mm" unter region-start verschwindet ...

        Die Außenabstände von region-body beziehen sich auf den Satzspiegel der Seite, der alle Bereiche enthält. In der Spezifikation wird das erläutert: "The spacing between the last four regions and the fo:region-body is determined by subtracting the relevant extent trait on the side regions from the trait that corresponds to the "margin-x" property on the fo:region-body.".

        Addiere also extent zum eigentlich erwarteten margin-Wert.

        Man liest sich,
        svg4you

        1. Hi,

          Die Außenabstände von region-body beziehen sich auf den Satzspiegel der Seite, der alle Bereiche enthält. In der Spezifikation wird das erläutert: "The spacing between the last four regions and the fo:region-body is determined by subtracting the relevant extent trait on the side regions from the trait that corresponds to the "margin-x" property on the fo:region-body.".

          Addiere also extent zum eigentlich erwarteten margin-Wert.

          Danke.
          Dann ist der default-Wert für den margin von region-body wohl nicht 0, sondern gleich den extent-Werten der jeweiligen Seiten.
          Ok, damit kann ich meine Werte berechnen.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      2. Hallo.

        ich mußte erst 1100g Maronen aus dem Wald befreien ...

        "Mein Held!"
        MfG, at

  3. Hi,

    neues Problem:

    Was ich erreichen will: in dem linken Bereich (region-start) muß ich einen Strichcode unterbringen (damit die ausgedruckten PDFs von einer Maschine weiterverarbeitet werden können).
    Eigentlich kein Thema - ich schieb in den Bereich einfach fo:block mit border-top (weiß für 0, schwarz für 1) und padding für den Abstand.
    Wenn ich die Striche direkt angebe, funktioniert es auch, also bei

      
    <fo:block padding-top="90mm">  
      <fo:block padding-top="3mm" border-top="solid 0.3mm black" />  
      <fo:block padding-top="3mm" border-top="solid 0.3mm white" />  
      <fo:block padding-top="3mm" border-top="solid 0.3mm white" />  
      <fo:block padding-top="3mm" border-top="solid 0.3mm black" />  
      <fo:block padding-top="3mm" border-top="solid 0.3mm white" />  
    </fo:block>  
    
    

    Auch das Auslesen der bits (Elemente mit Namen bit0 bzw. bit1 sind bereits im XML vorhanden) klappt, bei

      
    <fo:block padding-top="90mm">  
      <xsl:apply-templates select="barcode" />  
    </fo:block>  
      
    <xsl:template match="barcode">  
       <xsl:apply-templates />  
    </xsl:template>  
    <xsl:template match="bitgroup">  
       <xsl:apply-templates />  
    </xsl:template>  
    <xsl:template match="bit0">  
       0  
    </xsl:template>  
    <xsl:template match="bit1">  
       1  
    </xsl:template>  
    
    

    bekomme ich die korrekten Bits angezeigt.

    Kombiniere ich aber beides zu

      
    <fo:block padding-top="90mm">  
      <xsl:apply-templates select="barcode" />  
    </fo:block>  
      
    <xsl:template match="barcode">  
       <xsl:apply-templates />  
    </xsl:template>  
    <xsl:template match="bitgroup">  
       <xsl:apply-templates />  
    </xsl:template>  
    <xsl:template match="bit0">  
      <fo:block padding-top="3mm" border-top="solid 0.3mm white" />  
    </xsl:template>  
    <xsl:template match="bit1">  
      <fo:block padding-top="3mm" border-top="solid 0.3mm black" />  
    </xsl:template>  
    
    

    meldet FOP statt
    [INFO] Parsing of document complete, stopping renderer
    am Ende der Verarbeitung leider nur
    [ERROR] java.lang.NullPointerException

    Was ist daran denn jetzt schon wieder falsch?
    Das ist auch nicht einmal passiert, sondern ist reproduzierbar.
    Auskommentieren des <fo:block in den bit-Templates ==> kein Fehler,
    wieder reinnehmen ==> NullPointerException

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      meldet FOP statt
      [INFO] Parsing of document complete, stopping renderer
      am Ende der Verarbeitung leider nur
      [ERROR] java.lang.NullPointerException

      Ok, Ursache gefunden.
      Bei einem apply-templates war der select falsch, dadurch wurden fo:block-Elemente vom XSL-Prozessor direkt ins fo:root geschrieben.
      Die selbe Fehlermeldung tritt nicht nur, wenn das durch ein apply-templates geschieht, sondern auch, wenn ich das fo:block direkt ins fo:root schreibe.

      Die Fehlermeldung ist aber nicht wirklich hilfreich, ein "fo:block not allowed here" hätte mir sicher mehr geholfen als ein "NullPointerException"

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo,

        Die Fehlermeldung ist aber nicht wirklich hilfreich, ein "fo:block not allowed here" hätte mir sicher mehr geholfen als ein "NullPointerException"

        Ja, ein "NullPointerException" dürfte nie bis auf die Benutzeroberfläche vordringen.

  4. Hi,

    und noch ein Problem:

      
    <fo:block>Text 1</fo:block>  
    <fo:block>Text 2</fo:block>  
    
    

    führt zur Anzeige von zwei Zeilen im PDF.

      
    <fo:block-container>  
      <fo:block>Text 1</fo:block>  
      <fo:block>Text 2</fo:block>  
    </fo:block-container>  
    
    

    führt zur Anzeige von nichts im PDF.
    Keine Fehlermeldung - einfach nur keine (sichtbare) Ausgabe. Auch explizites Setzen von color="black" für den Container hilft nichts.

    Eigentlich wollte ich block-container nutzen, um den verschiedenen block-Dingern gemeinsame Eigenschaften zu setzen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Tach MudGuard,

      Eigentlich wollte ich block-container nutzen, um den verschiedenen block-Dingern gemeinsame Eigenschaften zu setzen.

      Die Einschränkungen von FOP sind dokumentiert.

      Verwende ein umschließendes block-Element als Workaround:

        
      <fo:block color="black">  
        <fo:block>Text 1</fo:block>  
        <fo:block>Text 2</fo:block>  
      </fo:block>
      

      Zu Deinem anderen Problem: Probiere es mal mit einer isolierten Transformation nach .fo und manueller Verarbeitung des Ergebnisses mit FOP.

      Man liest sich,
      svg4you

      1. Hi,

        Die Einschränkungen von FOP sind dokumentiert.

        Danke für den Link. Mein block-container war nicht direktes Kind von flow.

        Verwende ein umschließendes block-Element als Workaround:

        Das macht aber was ganz anderes - das hilft mir nicht wirklich.
        Gebe ich fo:block-container z.B. die Eigenschaft border="1mm solid black", sollte ja jedes darin befindliche fo:block-Element seine eigene Border haben.
        Nutze ich ein fo:block anstelle des fo:block-container und gebe ihm die Eigenschaft border="1mm solid black", gibt es genau eine border.

        Ich nutze jetzt xsl:use-attribute-sets - da muß ich zwar auch noch jeden der inneren fo:block anfassen (um ihm das xsl-use-attribute-sets zu verpassen), muß aber bei Änderungen an den Eigenschaften diese nur einmal machen (im xsl:attribute-set).

        Zu Deinem anderen Problem: Probiere es mal mit einer isolierten Transformation nach .fo und manueller Verarbeitung des Ergebnisses mit FOP.

        Transformation nach .fo funktioniert ohne Fehlermeldung (mit msxsl).
        Transformation .fo -> pdf mit fop liefert jetzt
        [ERROR] null

        Analyse des .fo hat ergeben: da wird Text direkt ins fo:root gerendert - es fehlen noch ein paar <xsl:template match="diesesElementNichtRendern" />

        Danke für Deine Hilfe.

        Ich war heute beim Wampentest *), daher erst jetzt eine Reaktion ...

        *)
        I gangert gern auf'd Kampenwand
        Wann i mit meiner Wampen kannt.

        (für die Norddeutschen: Ich ginge so gerne auf den Berg in den Chiemgauer Alpen namens Kampenwand, wenn ich dies mit meinem kleinen Bäuchlein könnte)

        --
        cu,
        Andreas
        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.