2013-02-13 5 views
1

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

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

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

enter image description here

Очевидно, что это проблема кодирования. Кажется, что символы UTF-8 правильно обрабатываются в формате PDF, но не в записях PDF, где, согласно следующим источникам, могут использоваться некоторые символы PDF-16 (но я не понял, какие из них).

The 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, которые удаляют пробелы, кроме пробелов, вкладок, перевода строки и возврата каретки?
  • Или мне нужна специальная обработка для мягкого дефиса?

ответ

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;', '-')"/> 
+0

Благодарим за предложение. Он работает и исправляет непосредственную проблему. –

6

Малого уточнения: Если вы используете XSLT2, будете более эффективным, чем в этом контексте. В XSLT2 вы всегда должны выбирать xsl: sequence over xsl: значение

+0

Спасибо за подсказку и работает. Я только что получил книгу Майкла Кей о XSLT и прочитал об этом ... –