换行xsl fop

时间:2017-03-29 07:09:07

标签: xml xslt apache-fop

我使用xslt和fop从xml中生成PDF。 在PDF中我希望拥有所有< br />取而代之的是换行符。

在第一个SalesOrderItem中,换行符在ShortDescription中,而且这个换行正常,但在第二个SalesOrderItem中,< br />在OrderText中,括号被转义。如你所见,有& lt; br /& gt;而不是< 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&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>

我的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="'&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 个答案:

答案 0 :(得分:0)

&#39>替换&#39;和&#39; by&#39;哪里错了。这是有效的:

<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>

在Oxygen Developer中,我无法使用它,但在运行的系统上,必须有一个不同的XSLT处理器,并且该处理器正在运行。