Unescape во время преобразования XSLT
Я преобразую XML-документ с помощью XSLT в XHTML, используя Saxon, совместимый с XSLT 2.0.
В моих XML-документах у меня есть такие узлы (усеченные здесь для краткости):
<script type="text/javascript">
document.write('<script>')
</script>
То, что я хочу иметь возможность сделать, - это распаковать экранированные символы так, чтобы < становилось < и > становилось >, в идеале только тогда, когда они встречаются в узлах скрипта.
Тогда конечным результатом будет:
<script type="text/javascript">
document.write('<script>')
</script>
Возможно ли это, и есть ли какие-либо предложения относительно того, как это сделать?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"/>
Да, это возможно: http://www.w3.org/TR/xslt#disable-output-escaping