通过page2fo.xsl遍历xml以生成PDF时读取另一个节点

时间:2013-08-01 08:05:44

标签: cq5 sling apache-fop

我正在尝试使用OOTB PDF重写器组件,并能够为简单的用例生成PDF,但在某些情况下它无法正常工作。

场景1:当页面将数据存储在单个节点中时,能够生成PDF。 场景2:当分页引用多个节点时无法生成PDF。

    <xsl:template match="jcr:content">
    <xsl:if test="@articleTitle">
        <fo:block font-size="30pt" 
            text-align="start" font-family="DinProLight">
            <xsl:value-of select="@articleTitle" />
        </fo:block>
    </xsl:if>

    <xsl:if test="@publishDate">
        <fo:block font-size="18pt" color="#777777" text-align="start" font-family="georgia;" 
        font-style="italic" padding-bottom="9px">
            <xsl:value-of select="concat(substring(@publishDate,9,2),'-',substring(@publishDate,7,2),substring(@publishDate,0,5))" />
        </fo:block>
    </xsl:if>

    <xsl:if test="@authorPath"> 
        <fo:block font-size="18pt" color="#777777"  padding="3px" text-align="start">
            <!--Below Code works fine -->
            <fo:external-graphic src="url('sling://etc/designs/XXXX/images/logo.jpg')" content-type="content-type:image/jpeg"/>         
            <!--Below Code Fails -->
            <xsl:value-of select="sling://content/XXXX/en/perspectives/tst_artcl/jcr:content@fullName"/>
        </fo:block>
    </xsl:if>


    <xsl:if test="@noOfViews">
        <fo:block font-size="11pt" color="#777777" text-align="right" font-family="arial" padding-bottom="9px" border-bottom="1px solid #777777">
            <xsl:value-of select="concat(@noOfViews,' Views')" />
        </fo:block>
    </xsl:if>
    <xsl:apply-templates />
</xsl:template>

1 个答案:

答案 0 :(得分:0)

默认情况下,PDF生成使用节点的默认xml渲染(content / app / page.xml),但由于您需要从多个节点获取信息,我建议您只创建自己的xml。 / p>

- 注册一个带有PDF扩展名和所选资源类型的servlet,并使用最方便的结构呈现包含所需信息的xml。 (您可以使用servlet中的resourceResolver访问您需要的任何节点。)

然后pdf重写器将使用您的xml表示而不是默认表示。

例如

@SlingServlet(
    description = "Employee PDF",
    extensions = { "pdf" },
    resourceTypes = { "greatapp/page/employee" },
    methods = { "GET" })
 public class EmployeePDFServlet extends SlingSafeMethodsServlet {

   protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws ServletException,
        IOException {
     //generate an xml here
    }
 }