I use an xslt and fop to generate a PDF out of the xml. in the PDF I want to have all <br/> replaced by a line break.
In the first SalesOrderItem, the line break is in ShortDescription and this one works fine but in the second SalesOrderItem the <br/> is in OrderText and the brackets are escaped. As you can see there is <br/> instead of <br/>. Here the line break is not working. I tried replacing but that did not work.
My xml looks like this:
<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<br/>17<br/>13.02.2017<br/>name 1<br/>12345<br/>Musterstadt<br/>Strasse 25<br/>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>
My XSLT looks like this:
<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:
I changed it to replace like this, but it won't replace. I guess my replace search string is wrong, but I couldn't figure out what I need to insert to make it match.
<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="'&lt;br/&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>
The params in 'replace' and 'by' where wrong. This is working:
<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="'<br/>'" />
<xsl:with-param name="by" select="'
'" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$newtext"/>
</fo:block>
In Oxygen Developer I couldn't get this to work but on the system this is running on, there must be a different XSLT processor and with that one it's working.