2011-07-20 18 views
9

嘗試使用XMLSpy創建基於XML和文件的PDF文件。用XSL-FO在PDF中添加換行符?

我試圖根據字段內容將字段拆分爲兩行。

例如,如果我的varialbe = 「李四AKA約翰尼d」,我想這麼看:

李四

約翰尼d

我的問題是,我可以」即使網絡上的所有樣本都可以工作。

這裏是我的代碼:

 <xsl:value-of disable-output-escaping="yes" select="concat(substring-before(//MyField,'AKA'),$newline,substring-after(//MyField,'AKA'))" /> 
    </xsl:when> 

所以基本上,eveytime我找到 「AKA」 字符串,我想打破字段分成兩行。 所以我的代碼找到了字符串,創建了新的變量,但仍然顯示在一行中。 我試着創建一個空行的變量,使用各種技術,但仍顯示在一行。

有什麼想法?

回答

16

請參閱my answer here關於使用十六進制實體引用和linefeed-treatment


編輯

我把你的代碼的註釋,並把它放在模板樣本XSLT樣式表。我改變的唯一的事情是:

  1. 我將newline變量更改爲&#xA;
  2. 我將linefeed-treatment="preserve"添加到您的fo:block

使用虛擬XML文件和XSLT樣式表,我製作了一個XSL-FO文檔,當使用FOP進行渲染時,在單獨的行上生成「John Doe」和「Johnny D」。

下面是XML文件:

<doc> 
    <MyField>John Doe AKA Johnny D</MyField> 
</doc> 

這裏是XSLT樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
      <fo:region-body margin="1in" margin-top="1.5in"/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
      <xsl:apply-templates/> 
     </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
    </xsl:template> 

    <xsl:template match="doc"> 
    <xsl:variable name="newline" select="'&#xA;'"/>   
    <xsl:variable name="MyVar"> 
     <xsl:choose> 
     <xsl:when test="contains(//MyField,'AKA')"> 
      <xsl:value-of select="concat(substring-before(//MyField,'AKA'),$newline,substring-after(//MyField,'AKA'))"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="//MyField"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <fo:block linefeed-treatment="preserve"> 
     <xsl:value-of select="$MyVar"/> 
    </fo:block> 
    </xsl:template> 

</xsl:stylesheet> 

這裏是導致XSL-FO:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
     <fo:region-body margin="1in" margin-top="1.5in"/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master page-height="11in" page-width="8.5in" master-name="my-page"> 
        <fo:region-body margin-top="1.5in" margin="1in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
       <fo:flow flow-name="xsl-region-body"> 
        <fo:block linefeed-treatment="preserve">John Doe 
Johnny D</fo:block> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

的PDF是一種單8。上5" ×11" 頁與此:

John Doe 
Johnny D 
+0

它只是不適合我。我使用了很多這裏找到的樣本,但似乎沒有任何工作。 – Elkucho

+0

你的鏈接沒有通過。另外,你是否在使用Apache FOP處理器? –

+0

對不起,當我說,發現在這裏,我的意思是在這個論壇。 ...是的,我正在使用Apache FOP。 – Elkucho

0

通過@丹尼爾 - 海利答案仍產生單對名稱的當源是:

<doc> 
    <MyField>John Doe AKA Johnny D</MyField> 
    <MyField>Johnny D AKA John Doe</MyField> 
    <MyField>John Smith</MyField> 
</doc> 

(在XPath 1.0,轉換一個節點設置爲一個字符串返回僅在節點集是第一按文檔順序節點的字符串值。參見https://www.w3.org/TR/xpath/#function-string。)

下面的樣式表分裂含有「AKA」任何文本節點。由於fo:block來自xsl:template對於MyField,此版本生成一個空的fo:block以導致換行。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
       <fo:region-body margin="1in" margin-top="1.5in" /> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="my-page"> 
      <fo:flow flow-name="xsl-region-body"> 
       <xsl:apply-templates /> 
      </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
</xsl:template> 

<!-- Could change to match on 'MyField/text()[contains(., ' AKA ')]' 
    if necessary. --> 
<xsl:template match="text()[contains(., ' AKA ')]"> 
    <xsl:value-of select="substring-before(., ' AKA ')" /> 
    <fo:block /> 
    <xsl:value-of select="substring-after(., ' AKA ')" /> 
</xsl:template> 

<xsl:template match="MyField"> 
    <fo:block> 
     <xsl:apply-templates /> 
    </fo:block> 
</xsl:template> 

</xsl:stylesheet>