2017-03-29 9 views
0

私はxsltとfopを使ってXMLからPDFを生成します。 PDFにありますすべて< br/>を改行で置き換えます。最初SalesOrderItemで xsl fopの改行

は、改行はShortDescriptionであり、この1が正常に動作しますが、第2 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> 

EDIT:

私はこのように置き換えるために、それを変更しましたが、それは勝ちました」置き換える。私は私の置換検索文字列が間違っていると思うが、私はそれを一致させるために挿入する必要があるのか​​分からなかった。

<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

周辺ブロックにlinefreed-treat = preserveがある場合は、fo:ブロックを使用する代わりに、 をテキストに挿入するだけで済みます。しかし、私はあなたがテンプレートを参照してください、あなたのテンプレートを参照してください、Brの中には、OrderText内<のには、どこか –

+0

にエスケープされているbrは、私は変更する機会がありませんXMLで既にエスケープされています。私はそれを改行 で置き換えようとしましたが、何とかそれを動作させることができませんでした。私は[リンク](http://stackoverflow.com/questions/3067113/xslt-string-replace)から解決策を試しましたが、一致させることができませんでした。何か案は? –

+0

テンプレートを使用して、 '& lt; br/& gt;'によって 右?出力に改行が含まれているかどうかを検証できますか?あるいは、改行はfopには入っていましたが、尊敬されませんでしたか? –

答えて

0

「置き換え」のパラメータと「間違え」のパラメータがあります。これが動作している:私はこれを動作させることができなかった酸素Developerで

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

が、システム上でこれが実行されている、別のXSLTプロセッサが存在する必要があり、そのいずれかでそれが働いています。