2011-08-12 32 views
8

Tôi đang tạo tệp xslt, tệp này sẽ chuyển đổi xml của tôi thành xsl-fo.Sử dụng XSLT để tạo XSL-FO với các thẻ in đậm/nghiêng lồng nhau

XML là một cái gì đó như thế:

<doc> 
    <par> 
    <point> 
     <text>some text</text> 
    </point> 
    </par> 
</doc> 

Tất nhiên, có rất nhiều đoạn văn và các điểm trong tài liệu. Tôi muốn thêm khả năng để định dạng "một số văn bản", ví dụ

<bold>bolded text</bold> and <italic>italic</italic> 

nên cung cấp cho

<fo:block><fo:inline font-weight="bold">bolded text</fo:inline> and <fo:inline font-style="italic">italic</fo:inline> 

Bây giờ tôi có tài liệu XSLT khá đơn giản, như thế này:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/> 
    <xsl:param name="versionParam" select="'1.0'"/> 
    <xsl:template match="doc"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> 
      <fo:region-body margin="2cm"/> 
      <fo:region-before margin="0.2cm" extent="1.5cm"/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="simpleA4"> 
     <fo:static-content flow-name="xsl-region-before" margin-right="1cm"> 
      <fo:block text-align="start" margin-top="0.2cm"> 
      <fo:block text-align="end" margin-top="0.2cm"> 
       Page <fo:page-number/> of <fo:page-number-citation ref-id="terminator"/> 
      </fo:block> 
     </fo:static-content> 
     <fo:flow flow-name="xsl-region-body"> 
      <xsl:apply-templates select="par/point"/> 
      <fo:block id="terminator"/> 
     </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
    </xsl:template> 
    <xsl:template match="point"> 
    <fo:block font-size="16pt" space-after="5mm"> 
     <xsl:value-of select="tresc"/> 
    </fo:block> 
    </xsl:template> 
</xsl:stylesheet> 

nên Tôi thêm một mẫu khác (đậm, nghiêng)? Làm thế nào tôi phải gọi nó trong nút "văn bản"?

Tôi tìm thấy một số giải pháp:

<xsl:template match="//bold"> 
    <fo:inline font-weight="bold"> 
     <xsl:value-of select="current()"></xsl:value-of> 
    </fo:inline> 
</xsl:template> 

Nhưng nó không làm việc cho tôi. Đầu ra xsl-fo không chứa bất kỳ fo: inline.

Trả lời

9

Hãy xem ví dụ này. Nó cho thấy rõ ràng làm thế nào để hanlde nút nội tuyến.

[XSLT 1.0]

<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:template match="doc"> 
     <fo:root> 
      <fo:page-sequence> 
       <fo:flow> 
        <xsl:apply-templates select="par/point"/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="point"> 
     <fo:block font-size="16pt" space-after="5mm"> 
      <xsl:apply-templates select="node()"/> 
     </fo:block> 
    </xsl:template> 

    <xsl:template match="bold"> 
     <fo:inline font-weight="bold"> 
      <xsl:apply-templates select="node()"/> 
     </fo:inline> 
    </xsl:template> 

    <xsl:template match="italic"> 
     <fo:inline font-style="italic"> 
      <xsl:apply-templates select="node()"/> 
     </fo:inline> 
    </xsl:template> 

</xsl:stylesheet> 

đưa ra:

<doc> 
    <par> 
     <point> 
      <text>some <bold>bold</bold></text> 
     </point> 
    </par> 
    <par> 
     <point> 
      <text>some <italic>italic <bold>bolded</bold></italic></text> 
     </point> 
    </par> 
</doc> 

sản xuất:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:page-sequence> 
     <fo:flow> 
     <fo:block font-size="16pt" space-after="5mm"> 
      some <fo:inline font-weight="bold">bold</fo:inline> 
       </fo:block> 
     <fo:block font-size="16pt" space-after="5mm"> 
      some <fo:inline font-style="italic">italic <fo:inline font-weight="bold">bolded</fo:inline> 
      </fo:inline> 
       </fo:block> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 
+0

Lệnh 'select = "nút()"' là không cần thiết. Từ http://www.w3.org/TR/xslt#section-Applying-Template-Rules: "Trong trường hợp không có thuộc tính' select', lệnh 'xsl: apply-templates' xử lý tất cả các phần tử con của nút hiện tại, bao gồm các nút văn bản. " –

Các vấn đề liên quan