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

Sus*_*ris 1 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>
Run Code Online (Sandbox Code Playgroud)

这在生成的页面中很好地工作,但在书签中创建了一个问题,其中显示符号代替软连字符.

在此输入图像描述

显然,这是一个编码问题.似乎在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>
Run Code Online (Sandbox Code Playgroud)

XSL样式表的版本为2.0.

我想创建一个删除违规字符的覆盖.我怎样才能做到这一点?

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

小智 6

小改进:如果您使用XSLT2,将比在此上下文中更有效.在XSLT2中,您应该始终优先选择xsl:sequence而不是xsl:value-of


JLR*_*she 5

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

<xsl:value-of select="normalize-space($topicTitle)"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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