Jeda baris di xsl fop

Saya menggunakan xslt dan fop untuk menghasilkan PDF dari xml. di PDF saya ingin semua ‹br/› diganti dengan jeda baris.

Di SalesOrderItem pertama, jeda baris ada di ShortDescription dan yang ini berfungsi dengan baik tetapi di SalesOrderItem kedua ‹br/› ada di OrderText dan tanda kurung di-escape. Seperti yang Anda lihat, ada br/ alih-alih ‹br/›. Di sini jeda baris tidak berfungsi. Saya mencoba mengganti tetapi tidak berhasil.

Xml saya terlihat seperti ini:

     <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 saya terlihat seperti ini:

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

Saya mengubahnya untuk menggantikan seperti ini, tetapi tidak dapat menggantikan. Saya kira string pencarian pengganti saya salah, tetapi saya tidak tahu apa yang harus saya masukkan agar cocok.

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

person j.bergmann    schedule 29.03.2017    source sumber
comment
Anda cukup menyisipkan ke dalam teks alih-alih menggunakan fo:block jika blok di sekitarnya memiliki linefreed-treatment=preserve. Namun, saya tidak melihat template br Anda dipanggil, br di dalam OrderText telah di-escape ke br di suatu tempat   -  person Stefan Hegny    schedule 29.03.2017
comment
br sudah lolos di xml, yang tidak bisa saya ubah. Saya mencoba menggantinya dengan jeda baris tetapi entah bagaimana saya tidak berhasil membuatnya berfungsi. Saya mencoba solusinya dari link tetapi saya tidak dapat mencocokkannya. Ada ide?   -  person j.bergmann    schedule 29.03.2017
comment
Jadi Anda mencoba templat untuk menggantikan 'lt;br/gt;' dengan benar? dan dapat memverifikasi bahwa outputnya berisi baris baru atau tidak? Atau baris baru sudah masuk tetapi tidak dihormati oleh pesolek?   -  person Stefan Hegny    schedule 29.03.2017
comment
@StefanHegny Saya mencoba mengganti dan tidak memasukkan karakter baris baru sebagai ganti br, silakan lihat hasil edit saya.   -  person j.bergmann    schedule 30.03.2017
comment
Hm, di editan kamu ganti dengan 20? (ca. baris 8)   -  person Stefan Hegny    schedule 30.03.2017
comment
benar, saya sudah mencobanya, tetapi tidak menggantikan apa pun   -  person j.bergmann    schedule 30.03.2017
comment
Saya bisa mereproduksinya. Menariknya sepertinya ia ingin string replace tidak lolos seperti '&lt;br/&gt;' Saya yakin beberapa penyihir dapat menjelaskan hal ini. Petunjuknya adalah pada keluaran (yang tidak diganti) muncul persis seperti itu...   -  person Stefan Hegny    schedule 30.03.2017


Jawaban (1)


Params di 'replace' dan 'by' jika salah. Ini berfungsi:

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

Di Oxygen Developer saya tidak dapat menjalankannya tetapi pada sistem yang menjalankannya, harus ada prosesor XSLT yang berbeda dan dengan prosesor tersebut ia berfungsi.

person j.bergmann    schedule 30.03.2017