Как удалить мягкий дефис Unicode из закладок PDF, созданных с помощью XSL-FO

Я конвертирую карты DITA в PDF, используя DITA Open Toolkit 1.7 и RenderX XEP. В темах DITA названия продуктов вставляются с помощью conrefs. Одно из названий моих продуктов довольно длинное. Это вызывало проблемы с макетом при использовании внутри таблиц. Поэтому я вставил мягкий дефис во фразу, которая повторно используется через conref:

<ph id="PD_FineReader2Comp">DOXiS4 FineReader2&#xad;Components</ph>

Это хорошо работает на сгенерированных страницах, но создает проблему в закладках, где вместо мягкого дефиса отображается символ.

введите здесь описание изображения

Очевидно, это проблема кодировки. Кажется, что символы UTF-8 правильно обрабатываются в содержимом PDF, но не в закладках 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, которые удаляют пробелы, кроме пробела, табуляции, перевода строки и возврата каретки?
  • Или мне нужна особая обработка мягкого дефиса?

person Susanne Muris    schedule 13.02.2013    source источник


Ответы (2)


Самый простой способ сделать это — использовать функцию 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;', '-')"/>
person JLRishe    schedule 13.02.2013
comment
Спасибо за предложение. Это работает и устраняет непосредственную проблему. - person Susanne Muris; 13.02.2013

Небольшое уточнение: если вы используете XSLT2, будет более эффективно, чем в этом контексте. В XSLT2 всегда следует отдавать предпочтение xsl:sequence, а не xsl:value-of.

person DrMacro    schedule 13.02.2013
comment
Спасибо за подсказку - проверено и работает. Я только что получил книгу Майкла Кея по XSLT и прочитал об этом... - person Susanne Muris; 14.02.2013