如何在fo:block-container和fo:table中创建超链接?

时间:2017-05-12 17:42:41

标签: xml xslt xsl-fo

我使用xslt从XML构建PDF。在pdf文件中,我需要在某些区域创建超链接,如整个表或某个区域(带有背景颜色的块容器)。我尝试使用< fo:basic-link external-destination =" http://...">,但没有成功。它适用于文本,但不适用于块容器和表。如果有人知道该怎么做,请帮忙。我使用Saxon和Apache FOP,以防万一。

2 个答案:

答案 0 :(得分:2)

fo:basic-linkhttps://www.w3.org/TR/xsl11/#fo_basic-link)是您制作链接的唯一选择。正如您所发现的那样,fo:basic-link是一个' inline' FO。在https://www.w3.org/TR/xsl11/#d0e6532

查看%block;%inline; FO的分类

但是,fo:basic-link定义为允许%block;内容,因此您应该能够在fo:table内放置fo:basic-link。即,使用嵌套,如:

fo:block
  fo:basic-link
    fo:table

但是,如果这不起作用,您可以将fo:table放在fo:inline-container内,因为这是一个内联的' FO也允许在fo:basic-link内。您最终会得到一个嵌套结构,如:

fo:block
  fo:basic-link
    fo:inline-container
      fo:table

格式化程序是否会做正确的事情是一个不同的问题,但两种方式都应该有效。

答案 1 :(得分:0)

@TonyGraham的答案适用于桌子。至少对于我的大多数页面而言。有些表仍有问题,但我认为可以通过某种方式解决。推荐的解决方案是:

fo:block
  fo:basic-link
    fo:inline-container
      fo:table

对于绝对定位的块容器,我提出了另一种解决方案。在块容器之前,我创建了另一个相同大小的块容器(也是绝对位置),在空SVG对象中有超链接:

<fo:block-container position="absolute" left="6.15cm" top="1.31cm" height="6cm" width="9.32cm" overflow="hidden">
    <fo:block> 
        <fo:basic-link>
            <xsl:attribute name="external-destination">
                <xsl:text>url(</xsl:text>
                <xsl:value-of select="$my-url"/>
                <xsl:text>)</xsl:text>
            </xsl:attribute>
            <fo:instream-foreign-object>
                <svg xmlns="http://www.w3.org/2000/svg" height="130" width="260" viewBox="0 0 260 130">
                    <text></text>
                </svg>
            </fo:instream-foreign-object>
        </fo:basic-link>
    </fo:block>
</fo:block-container>

在这种情况下有一些不便。为了获得SVG视图框大小,我使用了Inkscape图形编辑器(块 - 容器大小,以厘米为单位)。