не хочу, чтобы xslt интерпретировал символы сущности

xml был таким:

< cell i='0' j='0' vi='0' parity='Odd' subType='-1'> & #34;String& #39;</cell> 

Но после интерпретации xsl вывод выглядит следующим образом:

< td nowrap="true" class="gridCell" i="0" j="0">"String'< /td>

Я хотел бы сохранить & #34; и & #39;. Я пробовал карту персонажей, но она не работает. Код такой:

      < xsl:character-map name="raquo.ent">

         <xsl:output-character character="'" string="&amp;apos;"/>
         <xsl:output-character character="&#39;" string="&amp;apos;"/>
      < /xsl:character-map>

< xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" use-character-maps="raquo.ent"/>

Кто-нибудь может помочь? Большое тебе спасибо!


person Jamie    schedule 24.05.2011    source источник
comment
Пожалуйста, покажите XSLT, который обрабатывает этот текст. Вы можете использовать <xsl:value-of select="..." disable-output-escaping="yes"/>, чтобы предотвратить побег.   -  person khachik    schedule 24.05.2011
comment
@khachik, на самом деле это в ‹xsl:apply-templates select=./›, которые обрабатывают текст, я не знаю, как использовать для него карту символов.   -  person Jamie    schedule 24.05.2011
comment
вы можете использовать disable-output-escaping="yes" как в комментарии выше.   -  person khachik    schedule 24.05.2011
comment
@khachik, я пробовал, не работает.... Я написал как ‹xsl:apply-templates select=. отключить вывод-экранирование=да/›   -  person Jamie    schedule 24.05.2011
comment
Хороший вопрос, +1. Смотрите мой ответ для полного, короткого и простого решения.   -  person Dimitre Novatchev    schedule 24.05.2011


Ответы (1)


Это преобразование:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"
    use-character-maps="raquo.ent"/>

    <xsl:character-map name="raquo.ent">
     <xsl:output-character character="&#34;" string='&amp;#34;'/>
     <xsl:output-character character="&#39;" string='&amp;#39;'/>
    </xsl:character-map>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<cell i='0' j='0' vi='0' parity='Odd' subType='-1'>&#34;String&#39;</cell>

выдает желаемый правильный результат:

<cell i="0" j="0" vi="0" parity="Odd" subType="-1">&#34;String&#39;</cell>
person Dimitre Novatchev    schedule 24.05.2011
comment
@Dimitre Novatchev спасибо, но как вы это проверяете? Здесь все равно не работает :( - person Jamie; 24.05.2011
comment
@Jamie: я всегда проверяю свои решения - это было запущено с Saxon 9.1.07 и XQSharp. Если вы используете Altova, отправьте им сообщение об ошибке. - person Dimitre Novatchev; 24.05.2011
comment
@Dimitre Novatchev Кажется, карта символов не работает в XSLT 1.0. Она недействительна для страниц. Что я могу сделать? - person Jamie; 24.05.2011
comment
@Jamie: Вам нужно установить и использовать процессор XSLT 2.0. <xsl:character-map> — это функция XSLT2.0. - person Dimitre Novatchev; 24.05.2011
comment
@Dimitre Novatchev: Поскольку это проект нашей компании, я не знаю, будет ли он поддерживать XSLT 2.0. Знаете ли вы какой-либо другой метод, кроме карты символов? - person Jamie; 24.05.2011
comment
@Jamie: я задал аналогичный вопрос: stackoverflow.com/questions/5985615/ В итоге я не использовал XSLT для этой конкретной задачи, но в качестве действительно уродливого обходного пути вы можете попробовать предварительно обработать свой экземпляр и заменить каждый & на &amp; поэтому ваши сущности выглядят как &amp;#34;. Затем вам нужно будет опубликовать свой экземпляр после преобразования XSLT и заменить все &amp; на &. - person Daniel Haley; 24.05.2011
comment
@DevNull: Спасибо, попробую так. - person Jamie; 25.05.2011