Unescape во время преобразования XSLT


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

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

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

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

Тогда конечным результатом будет:

  <script type="text/javascript"> 
  document.write('<script>')
  </script> 
Возможно ли это, и есть ли какие-либо предложения относительно того, как это сделать?
2 4

2 ответа:

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

Из http://www.w3.org/TR/xslt#section-HTML-Output-Method

Метод вывода html не должен выполните экранирование для содержимого элементы script и style

Обновить

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

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

Из http://www.w3.org/TR/xslt#section-XML-Output-Method

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

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

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