2011-01-14 8 views
4

Я преобразовываю XML-документ с помощью XSLT в XHTML, используя Saxon, совместимый с XSLT 2.0.Unescape во время преобразования XSLT

В моих XML-документов, у меня есть узлы, как так (усеченный здесь для краткости):

<script type="text/javascript"> 
    document.write('&lt;script&gt;') 
    </script> 

То, что я хочу быть в состоянии сделать это unesacape уцелевших символов, так что &lt; становится < и &gt; становится >, в идеале, только когда они встречаются внутри узлов сценария.

Конечный результат будет таким:

<script type="text/javascript"> 
    document.write('<script>') 
    </script> 

Возможно ли это, и какие-либо предложения относительно того, каким образом?

+1

Joel , Мне любопытно, с каких пор Xalan XSLT 2.0 совместим? Насколько я знаю (http://xml.apache.org/xalan-j/), он реализует XSLT 1.0 и различные расширения. –

+0

Oops - My Bad. Я использую саксон. Отредактировано, чтобы это отразить. – Joel

ответ

3

С помощью метода html сериализации, script содержания не получает убежал.

От http://www.w3.org/TR/xslt#section-HTML-Output-Method

Метод html выход не должен избежать выполняют за содержание в script и style элементы

Update

Как д-р @Michael Кей прокомментировали, если вы создаете XH TML (и отправка с правильным MIME-типом) для браузеров, которые понимают XHTML, тогда вам не нужно беспокоиться о unescaping. Кроме того, следует отметить, что встроенный скрипт не считается хорошей практикой.

Если вы все еще хотите генерировать XHTML следующие рекомендации для устаревших браузеров, с помощью метода сериализации xml, вы можете объявить script контент как раздел CDATA.

http://www.w3.org/TR/xslt#section-XML-Output-Method От

The cdata-section-elements атрибут содержит список разделенных пробелами из QNames. Каждое QName расшифровывается в расширенное имя с использованием имен пространства имен , действующих в отношении элемента xsl:output, в котором встречается QName ; если существует пространство имен по умолчанию , оно используется для QNames, у которого нет . Расширение составляет , выполненное до слияния нескольких xsl:output элементов в одноместный эффективный элемент xsl:output. Если расширенное имя родителя текстового узла является членом списка, то текстовый узел должен быть выведен как секция CDATA

В качестве примера:

<xsl:output cdata-section-elements="xhtml:script xhtml:style" 
      xmlns:xhtml="http://www.w3.org/1999/xhtml"/> 
+3

Правильно. Если вы используете метод вывода HTML, символы не будут экранированы. Если вы используете метод вывода XHTML, они будут экранированы, но вам не нужно беспокоиться об этом, если браузер понимает XHTML (а если нет, то зачем его генерировать?) –

+0

@ Майкл Кэй: Я согласен: при создании XHTML вам не нужно unescape, потому что браузер должен правильно понимать XML. Добавляем это к ответу. –

+0

Спасибо обеим. Я рассмотрю настройки сериализации. – Joel

1

Да, это возможно: http://www.w3.org/TR/xslt#disable-output-escaping

+1

Да, действительно. Я также нашел этот дубликат вопрос http://stackoverflow.com/questions/646194/xsl-character-escape-problem – Joel

+0

Я думаю, что это делает то, что мне нужно: \t \t \t \t Joel

+2

Если вам нужен текст 'type =" text/javascript "', также выполните команду ' 'внутри' xsl: copy'. –

Смежные вопросы