экранирование тегов html внутри xslt: value-of select - PullRequest
2 голосов
/ 23 февраля 2011

Я преобразую текст внутри элемента документа XML (, который также содержит другие тексты, а не только гиперссылку ) в гиперссылку, используя следующее:

<xsl:value-of 
     select="replace(AUTHOR_CONTACT_INFORMATION, 
                     '(abc@yahoo.com)', 
                     '&lt;a href=&quot;$1&quot;&gt;$1&lt;/a&gt;')"/>

Источник XML:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at abc@yahoo.com for his email.</AUTHOR_CONTACT_INFORMATION>

К сожалению, я не могу избежать тегов '<' & '>', используемых в href.Мой XSLT-процессор является классом Qt4 QXmlQuery.Кажется, что он не поддерживает атрибут «disable-output-escaping» в вышеприведенном выражении, и я не могу найти другого способа, кроме как вручную проанализировать окончательный результат и заменить каждый «<» & «>» на «<'&'> 'с использованием кода C ++.

PS: Не удалось заставить' analysis-string 'работать в qt.Он просто возвращает пустую строку.Отвечал на http://www.dpawson.co.uk/xsl/rev2/regex2.html вопрос 3 и использовал следующее:

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="(abc@yahoo.com)">
    <xsl:matching-substring>
        <a href="{.}"><xsl:value-of select="." /></a>
    </xsl:matching-substring>

    <xsl:non-matching-substring>  
        <xsl:value-of select="." />
    </xsl:non-matching-substring>
</xsl:analyze-string>

Вышеописанное прекрасно работает в «Altova XMLSpy», делающем именно то, что я хочу.Но в Qt4 в выводе есть пустая строка (точнее, мой тег

до того, как это выражение также загадочным образом исчезло в выводе, странно).В документации Qt4 говорится, что его процессор поддерживает 'xsl: analysis-string'.У кого-нибудь есть рабочий пример 'xsl: analysis-string' в Qt?

Документация Qt4 гласит, что его процессор не поддерживает 'xsl: character-map', поэтому нет смысла идти туда.

Без 'xsl: analysis-string' я вернулся на круги своя с 'replace ()'.

-Sanjeev

1 Ответ

2 голосов
/ 23 февраля 2011

Привет всем, я конвертирую текст внутри Элемент документа XML на гиперссылку используя следующее:

<xsl:value-of select="replace(AUTHOR_CONTACT_INFORMATION,

'(RegEx здесь)', ' $ 1 ') "

К сожалению, я не могу избежать "<" & '>' теги, используемые в href

Краткий ответ : Вы даже не должны пытаться это делать.

Экранирующая разметка переводит ее в одномерный текст, и она будет отображаться только как текст в браузере.

Правильный способ сделать это - сгенерировать разметку в виде (последовательности) литеральных элементов результата:

<xsl:template match="AUTHOR_CONTACT_INFORMATION">
  <a href="{someExpression}"><xsl:value-of select="someExpr2"/></a>
</xsl:template>

ОБНОВЛЕНИЕ : ОП предоставила больше информации о реальной проблеме. Проблема в том, что следующее не работает на его XSLT-процессоре - Qt4 ???

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="(abc@yahoo.com)">
    <xsl:matching-substring>
        <a href="{.}">
            <xsl:value-of select="." />
        </a>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
        <xsl:value-of select="." />
    </xsl:non-matching-substring>
</xsl:analyze-string>

Я проверил, что этот код ведет себя как ожидалось и дает ожидаемый результат при запуске под Saxon 9.1.05.

Это означает, что Qt4 не является совместимым процессором XSLT 2.0.

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

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="AUTHOR_CONTACT_INFORMATION">
  <xsl:value-of select=
   "substring-before(., 'abc@yahoo.com')"/>
  <a href="abc@yahoo.com">abc@yahoo.com</a>
  <xsl:value-of select=
   "substring-after(., 'abc@yahoo.com')"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at abc@yahoo.com for his email.</AUTHOR_CONTACT_INFORMATION>

желаемый, правильный результат получается (со всеми 8 различными процессорами XSLT, которые у меня есть):

Plugin author can be reached at <a href="abc@yahoo.com">abc@yahoo.com</a> for his email.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...