Announcement

Collapse
No announcement yet.

Zeilenumbrüche mit Inhalten aus der Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeilenumbrüche mit Inhalten aus der Datenbank

    Hallo zusammen,

    ich habe eine Datenbank aus der ich mir ein XML generiere. Die Datenbank hat ein Feld welches ein einfaches TEXT ist und quasi ne menge Text beinhalten kann mit "normalen" Zeilenumbrüchen.

    Transformiere ich nun diese XML Daten mit XSL-FO in ein PDF (ich nutze FOP dafür) werden diese Zeilenumbrüche natürlich ignoriert.
    Also gehe ich zuvor her und nutze die PHP-Funktion nl2br um die Zeilenumbrüche in <br /> umzuwandeln (allein um den verschiedenen OS zuvorzukommen) .
    Nun versuche ich über folgenden Code Zeilenumbrüche zu erzwingen:

    Code:
     <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:fo="http://www.w3.org/1999/XSL/Format">
    
            <xsl:template match="/">
              <xsl:apply-templates select="textfieldvalue" />
            </xsl:template>
    
    	<xsl:template match="br">
    		<fo:block />
    	</xsl:template>
    
    	<xsl:template match="textfieldvalue">
    		<xsl:apply-templates />
    	</xsl:template>
    
    </xsl:stylesheet>
    Dies funktioniert auch, allerdings nur bedingt. Wenn ich z.b. 2 <br> im Text habe, wird durch die Transformation nur ein Zeilenumbruch erzeugt.

    Ich habe google gefragt, ich habe alle möglichen Foren durchforstet und auch zig Ansätze gefunden aber scheinbar ist obige Lösung die bei mir halbwegs funktioniert. Wenn ich dort noch x-Zeilenumbrüche einbringen kann, entsprechend der <br> im XML wäre ich wieder glücklich

    Ich hoffe das sich hier der ein oder andere findet, der mir diesbezüglich helfen kann.

    TIA,
    Iridion

  • #2
    Ich vermute, dass die Transformation durchaus mehrere leere Blöcke erzeugt, aber der Renderer dann einen daraus macht. Probiere es so:
    Code:
    <fo:block>&#xA0;</fo:block>
    oder versuche nach der Anzahl der br-Elemente entsprechend mehr oder weniger margin-top oder margin-bottom für einen Block auszugeben, zähle also br + following-sibling::br und schreibe anzahl * wert [Einheit] ...

    Comment


    • #3
      Hallo,
      das mit dem &#xA; oder &#xA; habe ich bereits versucht auch in Kombination mit <fo:block> als auch <xsl:text> hat mir aber beides nichts gebracht.

      Dennoch habe ich die Lösung gefunden, schon merkwürdig das es soviele verschiedene Workarounds gibt

      Also alles zurück, den Inhalt aus der DB einfach auslesen und so wie er im Textfeld war ins XML packen, via XSL-FO transformieren, dann
      im Ausgebenden Blockelement müssen lediglich folgende Attribute angegeben sein und schon klappts

      Code:
      <fo:block 
      	white-space-treatment="preserve" linefeed-treatment="preserve"
      	white-space-collapse="false" 
      	position="absolute">
      
      Text
      </fo:block>
      Dennoch danke für Deinen Tip.

      HTH,
      Iridion

      Comment

      Working...
      X