2017-03-29 3 views
0

Ich benutze ein xslt und fop, um eine PDF aus dem XML zu generieren. im PDF Ich möchte alle < br/> durch einen Zeilenumbruch ersetzt haben.Zeilenumbruch in xsl fop

In der ersten SalesOrderItem, der Zeilenumbruch ist in ShortDescription und das funktioniert gut, aber in der zweiten SalesOrderItem die < br/> ist in OrderText und die Klammern sind escaped. Wie Sie sehen können, gibt es & lt; br/& gt; anstelle von < br/>. Hier funktioniert der Zeilenumbruch nicht. Ich habe versucht, zu ersetzen, aber das hat nicht funktioniert.

Meine xml sieht wie folgt aus:

 <SalesOrderItem> 
    <ReceivingPerson>...</ReceivingPerson> 
    <Building /> 
    <Department>...</Department> 
    <Floor /> 
    <Room /> 
    <DeliveryAddress> 
    </DeliveryAddress> 
    <IsFreetext>false</IsFreetext> 
    <OrderItemNo>1</OrderItemNo> 
    <ProductId>800100</ProductId> 
    <ExtProductId /> 
    <ProductDescShort>Text1 <br/><b>text2</b></ProductDescShort> 
    <Quantity>1,00</Quantity> 
    <PriceUnit>1</PriceUnit> 
    <NetPrice>20,00</NetPrice> 
    <TotalNetPrice>20,00</TotalNetPrice> 
    <GLAccount> 
     <GLAccountId>123</GLAccountId> 
     <DescShort /> 
     <CustomerId>customer1</CustomerId> 
    </GLAccount> 
    <DeliveryDate>06.04.2017</DeliveryDate> 
    <OrderText /> 
    <UnitOfMeasure id='PCE'> 
     <Description>Stück</Description> 
    </UnitOfMeasure> 
    <Status id='090'> 
     <StatusDesc>offen</StatusDesc> 
    </Status> 
    <Tax id='BB'> 
     <Description>19%</Description> 
    </Tax> 
    <CostDistribution> 
     <CostDistributionPositions> 
     <CostDistributionPos> 
      <CostObject> 
      <CostObjectId>1006901</CostObjectId> 
      <CostObjectType>COSTCENTER</CostObjectType> 
      <CustomerId>customer1</CustomerId> 
      <MasterCostObjectId>NP-RNS</MasterCostObjectId> 
      </CostObject> 
      <Percentage>100,00</Percentage> 
     </CostDistributionPos> 
     </CostDistributionPositions> 
    </CostDistribution> 
    <DocumentAttachments /> 
    <Attributes /> 
    <ExtGLAccountId /> 
    <Comment /> 
    <Supplier supplierId='90025370'> 
     <SupplierName>WORDSHOP</SupplierName> 
     <SupplierLanguage>de</SupplierLanguage> 
     <AddressAssociation type='default' default='true'> 
     <Address id='90025370'> 
     </Address> 
     </AddressAssociation> 
     <TermsOfDelivery> 
     <Description /> 
     <LongDescription /> 
     </TermsOfDelivery> 
     <TermsOfPayment> 
     <Description>30 Tage netto</Description> 
     <LongDescription>30 Tage netto</LongDescription> 
     <DiscountDays1>30</DiscountDays1> 
     <DiscountDays2>0</DiscountDays2> 
     <NetDays /> 
     <DiscountPerc1>0</DiscountPerc1> 
     <DiscountPerc2>0</DiscountPerc2> 
     </TermsOfPayment> 
    </Supplier> 
    </SalesOrderItem> 
    <SalesOrderItem> 
    <ReceivingPerson>fdf</ReceivingPerson> 
    <Building /> 
    <Department/> 
    <Floor /> 
    <Room /> 
    <DeliveryAddress> 
    </DeliveryAddress> 
    <IsFreetext>false</IsFreetext> 
    <OrderItemNo>2</OrderItemNo> 
    <ProductId>50049411</ProductId> 
    <ExtProductId /> 
    <ProductDescShort>Product desc</ProductDescShort> 
    <Quantity>1.670,00</Quantity> 
    <PriceUnit>1</PriceUnit> 
    <NetPrice>0,01</NetPrice> 
    <TotalNetPrice>16,70</TotalNetPrice> 
    <GLAccount> 
     <GLAccountId>9764955002</GLAccountId> 
     <DescShort /> 
     <CustomerId>customer1</CustomerId> 
    </GLAccount> 
    <DeliveryDate>30.03.2017</DeliveryDate> 
    <OrderText>7090070589&lt;br/&gt;17&lt;br/&gt;13.02.2017&lt;br/&gt;name 1&lt;br/&gt;12345&lt;br/&gt;Musterstadt&lt;br/&gt;Strasse 25&lt;br/&gt;D</OrderText> 
    <UnitOfMeasure id='PCE'> 
     <Description>Stück</Description> 
    </UnitOfMeasure> 
    <Status id='090'> 
     <StatusDesc>offen</StatusDesc> 
    </Status> 
    <Tax id='N8'> 
     <Description>7%</Description> 
    </Tax> 
    <CostDistribution> 
     <CostDistributionPositions> 
     <CostDistributionPos> 
      <CostObject> 
      <CostObjectId>1006901</CostObjectId> 
      <CostObjectType>COSTCENTER</CostObjectType> 
      <CustomerId>customer1</CustomerId> 
      <MasterCostObjectId>c1</MasterCostObjectId> 
      </CostObject> 
      <Percentage>100,00</Percentage> 
     </CostDistributionPos> 
     </CostDistributionPositions> 
    </CostDistribution> 
    <DocumentAttachments /> 
    <Attributes /> 
    <ExtGLAccountId /> 
    <Comment /> 
    <Supplier supplierId='90004996'> 
     <SupplierName>supplier1</SupplierName> 
     <SupplierLanguage>de</SupplierLanguage> 
     <AddressAssociation type='default' default='true'> 
     <Address id='90004996'> 
     </Address> 
     </AddressAssociation> 
     <TermsOfDelivery> 
     <Description /> 
     <LongDescription /> 
     </TermsOfDelivery> 
     <TermsOfPayment> 
     <Description>innerhalb von 14 Tagen ohne Abzug</Description> 
     <LongDescription>innerhalb von 14 Tagen ohne Abzug</LongDescription> 
     <DiscountDays1>14</DiscountDays1> 
     <DiscountDays2>0</DiscountDays2> 
     <NetDays /> 
     <DiscountPerc1>0</DiscountPerc1> 
     <DiscountPerc2>0</DiscountPerc2> 
     </TermsOfPayment> 
    </Supplier> 
    </SalesOrderItem> 

Meine XSLT sieht wie folgt aus:

<xsl:template match="br"> 
<fo:block><xsl:apply-templates/></fo:block> 
</xsl:template> 
... 
<xsl:for-each select="SalesOrder/SalesOrderItems/SalesOrderItem"> 
... 
<xsl:if test="ProductDescShort"> 
<fo:block><xsl:apply-templates select="ProductDescShort"/></fo:block> 
</xsl:if> 
... 
<xsl:if test="OrderText!=''"> 
<fo:table-row keep-with-next.within-line="always" keep-with-previous.within-line="always" keep-with-previous.within-column="always" keep-with-previous.within-page="always"> 
<fo:table-cell/><fo:table-cell number-columns-spanned="3" display-align="before"> 
    <fo:block position="relative" white-space-collapse="false" linefeed-treatment="preserve" start-indent="2.0pt" display-align="before" text-align="start" color="#000000" font-family="Arial" font-size="10.0pt"> 
    <xsl:apply-templates select="OrderText"/> 
    </fo:block> 
</fo:table-cell> 
... 
</xsl:for-each> 

EDIT:

ich es geändert, so zu ersetzen, aber es gewann‘ t ersetzen. Ich denke, mein Ersatz-Suchstring ist falsch, aber ich konnte nicht herausfinden, was ich einfügen muss, damit es übereinstimmt.

<xsl:if test="OrderText!=''"> 
<fo:table-row keep-with-next.within-line="always" keep-with-previous.within-line="always" keep-with-previous.within-column="always" keep-with-previous.within-page="always"> 
<fo:table-cell/><fo:table-cell number-columns-spanned="3" display-align="before"> 
<fo:block position="relative" white-space-collapse="false" linefeed-treatment="preserve" start-indent="2.0pt" display-align="before" text-align="start" color="#000000" font-family="Arial" font-size="10.0pt"> 
<xsl:variable name="newtext"> 
<xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="OrderText" /> 
     <xsl:with-param name="replace" select="'&amp;lt;br/&amp;gt;'" /> 
     <xsl:with-param name="by" select="20" /> 
    </xsl:call-template> 
</xsl:variable> 
<xsl:value-of select="$newtext"/> 
</fo:block> 
</fo:table-cell> 
... 
<!-- Replace Template --> 
<xsl:template name="string-replace-all"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
     <xsl:when test="$text = '' or $replace = ''or not($replace)" > 
      <!-- Prevent this routine from hanging --> 
      <xsl:value-of select="$text" /> 
     </xsl:when> 
     <xsl:when test="contains($text, $replace)"> 
      <xsl:value-of select="substring-before($text,$replace)" /> 
      <xsl:value-of select="$by" /> 
      <xsl:call-template name="string-replace-all"> 
       <xsl:with-param name="text" select="substring-after($text,$replace)" /> 
       <xsl:with-param name="replace" select="$replace" /> 
       <xsl:with-param name="by" select="$by" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+1

Sie können einfach in den Text einfügen, anstatt einen fo: block zu verwenden, wenn der umgebende Block linefreed-treatment = preserve hat. Wie auch immer, ich sehe Sie nicht br Vorlage aufgerufen, die Br in der OrderText wurden zu <Br> irgendwo –

+0

irgendwo die Br entkommen sind bereits in der XML, die ich keine Chance haben, zu ändern. Ich habe versucht, es durch einen Zeilenumbruch zu ersetzen, aber irgendwie konnte ich es nicht schaffen, es zur Arbeit zu bringen. Ich habe versucht, die Lösung von [link] (http://stackoverflow.com/questions/3067113/xslt-string-replace), aber ich konnte es nicht übereinstimmen. Irgendwelche Ideen? –

+0

Sie haben also versucht, die Vorlage zu ersetzen die '& lt; br/& gt;' von richtig? und könnte überprüfen, ob die Ausgabe die Zeilenumbrüche enthält oder nicht? Oder die Newlines wurden in, aber nicht von fop respektiert? –

Antwort

0

Die params in "ersetzen" und "durch" waren falsch. Dies funktioniert:

<fo:block position="relative" white-space-collapse="false" linefeed-treatment="preserve" start-indent="2.0pt" display-align="before" text-align="start" color="#000000" font-family="Arial" font-size="10.0pt"> 
<xsl:variable name="newtext"> 
<xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="OrderText" /> 
     <xsl:with-param name="replace" select="'&lt;br/&gt;'" /> 
     <xsl:with-param name="by" select="'&#xa;'" /> 
    </xsl:call-template> 
</xsl:variable> 
<xsl:value-of select="$newtext"/> 
    </fo:block> 

In Oxygen Entwickler konnte ich das nicht auf dem System zu arbeiten, aber das läuft auf, muss es ein anderer XSLT-Prozessor sein und mit, dass man es funktioniert.

Verwandte Themen