2013-12-15 25 views
8

Tôi có tệp xml trong utf-8 với thuộc tính mã hóa.Có xslt-fo không hỗ trợ utf-8 không?

Khi tôi thực thi fop -xml xml.xml -xsl xsl.xsl -pdf pdf.pdf, pdf đầu ra của tôi đã bị hỏng các ký tự utf-8. Điều quan trọng, văn bản từ tệp xsl không có ký tự utf-8, giống như văn bản từ xml.

Các ký tự utf-8 được thay thế bằng #.

Điều gì có thể sai?

XSL file:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java" version="1.0" xmlns="http://www.w3.org/1999/xhtml"> 
<xsl:output method="xml" version="1.0" indent="yes" encoding="UTF-8" /> 

<xsl:template match="/"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

     <fo:layout-master-set> 
      <fo:simple-page-master master-name="A4" margin="1cm"> 
      <fo:region-body margin="2cm" margin-left="1cm" margin-right="1cm"/> 
      <fo:region-before extent="3cm"/> 
      <fo:region-after extent="5mm"/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 

     <fo:page-sequence master-reference="A4"> 
      <fo:static-content flow-name="xsl-region-before"> 
       <fo:block font-size="24pt" font-family="Calibri">Filmoteka</fo:block> 
      </fo:static-content> 
      <fo:static-content flow-name="xsl-region-after"> 
       <fo:block font-size="10pt" font-family="Calibri">Wygenerowano: <xsl:call-template name="dataCzas" /></fo:block> 
      </fo:static-content> 

      <fo:flow flow-name="xsl-region-body"> 
       <fo:block font-size="12pt" font-family="Calibri" padding-after="1cm"> 
        <fo:table table-layout="fixed" width="100%" border="solid black 1px"> 
        <fo:table-column column-width="8mm"/> 
        <fo:table-column column-width="40mm"/> 
        <fo:table-column column-width="40mm"/> 
        <fo:table-column column-width="13mm"/> 
        <fo:table-column column-width="65mm"/> 
         <fo:table-header> 
          <fo:table-row> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Lp.</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Tytuł PL</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Reżyseria</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Rok</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Obsada</fo:block> 
           </fo:table-cell> 
          </fo:table-row> 
         </fo:table-header> 
         <fo:table-body> 
          <xsl:apply-templates /> 
         </fo:table-body> 
        </fo:table> 
       </fo:block> 
      </fo:flow> 



     </fo:page-sequence> 

    </fo:root> 
</xsl:template> 


<xsl:template match="film"> 
    <fo:table-row> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block><xsl:number format="1"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="tytul_pol"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="rezyser"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="rok"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="obsada"/></fo:block> 
     </fo:table-cell> 
    </fo:table-row> 
</xsl:template> 

<xsl:template name="dataCzas"> 
    <xsl:value-of select="java:format(java:java.text.SimpleDateFormat.new('dd MMMM yyyy, HH:mm:ss'), java:java.util.Date.new())"/> 
</xsl:template> 

</xsl:stylesheet> 

xml file:

http://pastebin.com/fr9fChtn

+0

bạn cũng có mẫu xml chưa? – rene

+0

có, tôi đã thay thế câu hỏi của mình – user3050705

Trả lời

6

Nếu FOP kết quả đầu ra nhân vật như #, font được chọn không bao gồm một hình tượng đại diện cho họ.

Đây là có lẽ vì tập tin đầu vào XML của bạn có chứa đường như:

<kraj>Francja, USA, Włochy</kraj> 

Nhân vật có vấn đề ở đây là ł.

Vì vậy, để trả lời câu hỏi của bạn: FOP không hỗ trợ UTF-8, nó chỉ là phông chữ (trong trường hợp của bạn: font-family='Calibri') không có phương tiện để đại diện cho các ký tự.

Nếu đây thực sự là trường hợp, FOP nên ra một cảnh báo dọc theo dòng của

WARNING: Glyph for "ł" not available in font "DejaVuSans" 

Bây giờ, để cũng chiếm những nhân vật không có mặt trong bất cứ phông chữ mà bạn đã chọn, hoặc là thay đổi phông chữ đầu ra alltogether hoặc, như một cách giải quyết, cô lập chúng với inline.

Ví dụ, đây là cách bạn chắc chắn rằng cho nhân vật Σ (một nhà điều hành toán học), phông chữ phải được chọn:

<fo:block> 
    <fo:inline font-family='Symbol'>Σ</fo:inline> 
</fo:block> 

Xem trang này để biết thêm về phông chữ với FOP: http://xmlgraphics.apache.org/fop/trunk/fonts.html.

0

Giải pháp có thể đơn giản hơn nhiều. Trong trường hợp của chúng tôi, chúng tôi đã cảnh báo cho glyphs mất tích, đọc font FOP trang web cấu hình và chỉ cần thêm

mã hóa-mode = "single-byte"

định nghĩa font chữ Calibri để embedd font đầy đủ. Điều này giải quyết vấn đề cho chúng tôi (với FOP 2.0).