如何从使用XSL-FO生成的PDF书签中删除Unicode软连字符

时间:2013-02-13 18:22:04

标签: xslt pdf-generation xsl-fo dita dita-ot

我正在使用DITA Open Toolkit 1.7和RenderX XEP将DITA地图转换为PDF。在DITA主题中,使用conrefs插入产品名称。我的一个产品名称很长。在表中使用时会导致布局问题。因此,我在通过conref:

重用的短语中插入了一个软连字符
<ph id="PD_FineReader2Comp">DOXiS4 FineReader2&#xad;Components</ph>

这在生成的页面中很有效,但在书签中创建了一个问题,其中显示符号代替软连字符。

enter image description here

显然,这是编码问题。似乎在PDF内容中正确处理了UTF-8字符,但在PDF书签中没有,根据以下来源,可以使用一些PDF-16字符(但我不明白哪些)。

DITA Open Toolkit似乎使用此代码片段从主题标题创建书签:

         <fo:bookmark>
            <xsl:attribute name="internal-destination">
                <xsl:call-template name="generate-toc-id"/>
            </xsl:attribute>
                <xsl:if test="$bookmarkStyle!='EXPANDED'">
                    <xsl:attribute name="starting-state">hide</xsl:attribute>
                </xsl:if>
            <fo:bookmark-title>
                <xsl:value-of select="normalize-space($topicTitle)"/>
            </fo:bookmark-title>
            <xsl:apply-templates mode="bookmark"/>
        </fo:bookmark>

XSL样式表的版本为2.0。

我想创建一个删除违规字符的覆盖。我怎么能这样做?

  • 是否可以正确解决编码问题? (可能不可能)。
  • 是否有任何XSL函数或属性可以删除空格,制表符,换行符和回车符以外的空格?
  • 或者我需要对软连字符进行特殊处理吗?

2 个答案:

答案 0 :(得分:6)

小改进:如果您使用XSLT2,将比在此上下文中更有效。在XSLT2中,您应该始终更喜欢xsl:sequence over xsl:value-of

答案 1 :(得分:5)

执行此操作的简单方法是使用translate()函数,该函数可用于将某些字符替换为其他字符,或者不使用任何字符。看起来这是输出您想要修复的值的行:

<xsl:value-of select="normalize-space($topicTitle)"/>

所以你可以简单地将其修改为:

<xsl:value-of select="translate(normalize-space($topicTitle), '&#xad;', '')"/>

删除所有软连字符。如果您想用空格或普通连字符替换它们,您可以分别执行以下任一操作:

<xsl:value-of select="translate(normalize-space($topicTitle), '&#xad;', ' ')"/>
<xsl:value-of select="translate(normalize-space($topicTitle), '&#xad;', '-')"/>