xsl fop 中的换行符
Line break in xsl fop
我使用 xslt 和 fop 从 xml 生成 PDF。
在 PDF 中,我想将所有
替换为换行符。
在第一个 SalesOrderItem 中,换行符在 ShortDescription 中,这个工作正常,但在第二个 SalesOrderItem 中,
在 OrderText 中,括号被转义。如您所见,有 <br/>;而不是
。这里换行符不起作用。
我尝试更换但没有用。
我的 xml 看起来像这样:
<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>
我的 XSLT 如下所示:
<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>
编辑:
我改成这样替换,但是不会替换。我想我的替换搜索字符串是错误的,但我无法弄清楚我需要插入什么才能使其匹配。
<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>
'replace' 和 'by' 中的参数错误。这是有效的:
<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>
在 Oxygen Developer 中我无法让它工作,但在系统上这是 运行,必须有一个不同的 XSLT 处理器并且它正在工作。
我使用 xslt 和 fop 从 xml 生成 PDF。
在 PDF 中,我想将所有
替换为换行符。
在第一个 SalesOrderItem 中,换行符在 ShortDescription 中,这个工作正常,但在第二个 SalesOrderItem 中,
在 OrderText 中,括号被转义。如您所见,有 <br/>;而不是
。这里换行符不起作用。
我尝试更换但没有用。
我的 xml 看起来像这样:
<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>
我的 XSLT 如下所示:
<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>
编辑:
我改成这样替换,但是不会替换。我想我的替换搜索字符串是错误的,但我无法弄清楚我需要插入什么才能使其匹配。
<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>
'replace' 和 'by' 中的参数错误。这是有效的:
<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>
在 Oxygen Developer 中我无法让它工作,但在系统上这是 运行,必须有一个不同的 XSLT 处理器并且它正在工作。