Главная » XSLT » Обработка строковых литералов, содержащих кавычки

0

Задача

В XSLT 1.0 обрабатывать строковые литералы, содержащие кавычки, трудно, поскольку не существует никакого символа экранирования.

Решение

Эта проблема решается за счет нового соглашения: чтобы экранировать сим­вол кавычки, нужно ввести его два раза подряд. Ниже мы пытаемся выполнить сопоставление со строками, заключенными в двойные или одинарные кавычки. Атрибут test мы заключили в одинарные кавычки, следовательно, строковый литерал для регулярного выражения нужно заключить в двойные. Поэтому все двойные кавычки внутри этого литерала необходимо продублировать. Правила XML вынуждают нас использовать компонент ' вместо ", но это лишь под­черкивает тот факт, что экранирование средствами XML – отдельный вопрос, само по себе это не помогает решить задачу. Другими словами, если заменить "" на ", то анализатор XML будет доволен, но анализатору XSLT этого мало.

<xsl:if test=" matches(., ‘ ” [Л11] ” | &apos;[A&apos;] &apos; ‘,’x’) "> </xsl:if>

Эквивалентное решение выглядит так:

<xsl:if test=" matches(., ‘ &quot; [A&quot;] &quot; | ,,[л1‘] ” ‘,’x’) "> </xsl:if>

Обсуждение

Отсутствие символа экранирования в XSLT 1.0 было большим неудобством, но его можно было обойти с помощью переменных и конкатенации:

<xsl:variable name="d-quote" select="’"/> <xsl:variable name="s-quote" select="’"/>

<xsl:value-of select="concat(‘He said,’, $d-quote, ‘John’, $s-quote, ‘s’, ‘dog turned green.’, $d-quote)"/>

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии