Синтаксический анализ XSL сокращает тег сценария, вызывая проблемы в IE. - PullRequest
3 голосов
/ 08 октября 2009

У меня есть приложение на C #, которое генерирует html-документ из преобразования xml-файла в xsl-файл. В моем шаблоне xsl я ссылаюсь на внешний файл javascript следующим образом:

<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ></script>

после преобразования предыдущая строка переводится в:

<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" />

Для Firefox и Chrome это не проблема, однако IE выдает ошибку «объект не найден» и не работает. Любые предложения для того, чтобы IE понравился этот синтаксис? Или мне нужно что-то сделать в моем xsl (или в классе C # XslCompiledTransform), чтобы сохранить синтаксис?

Решение: Помещая <![CDATA[ <!-- Some Comment --> ]]> между тегами сценария, парсер не пытается сократить конечный тег.

Ответы [ 7 ]

7 голосов
/ 08 октября 2009

Попробуйте поместить пустой раздел CDATA внутрь. Это должно заставить синтаксический анализатор не связываться с вашими тегами скрипта.

<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ><![CDATA[ ]]></script>
3 голосов
/ 30 декабря 2009

На самом деле Бобинс прав. Если вы используете ...

<xsl:output method="html"/>

... вы можете получить правильный вывод для XslCompiledTransform , но вы должны использовать его OutputSettings с XmlWriter, который вы используете в качестве объекта вывода:

XslCompiledTransform xslt = new XslCompiledTransform(true);

xslt.Load("stylesheetFile.xsl");

XmlWriter outputWriter = XmlWriter.Create("outputfile.html", xslt.OutputSettings);

xslt.Transform(input, null, outputWriter);

Таким образом, method = "html" работает, поэтому script, textarea и др. сохраняют свои закрывающие теги.

2 голосов
/ 08 октября 2009

Не сохраняйте его, но если вы создаете обратно-совместимый HTML, вам нужно сообщить процессору XSLT, что HTML-совместимый XHTML - это то, что вам нужно, а не универсальный XML с самозакрытием:

<xsl:output method="xhtml"/>

К сожалению, метод вывода ‘xhtml ’- это расширение XSLT 2.0, которое не поддерживается в .NET XslTransform, поэтому вместо него вам придется использовать старый добрый унаследованный HTML-код:

<xsl:output method="html"/>

(и соответствующий HTML 4.01 DOCTYPE вместо XHTML.)

Размещение некоторого фиктивного контента в <script> может решить вашу непосредственную проблему, но могут быть и другие места, где метод вывода по умолчанию «xml» будет приводить к неподходящей разметке для устаревших браузеров, таких как IE.

Re: комментарий. Хм ... ты прав! Метод вывода «html» не создает корректный HTML; метод вывода «xhtml» не создает XHTML, совместимый с Приложением XHTML. Более того, «html» включает в себя такие положения, как не экранирование «<» и деэкранирование древнего и безубыточного Netscape 4 создайте '& {...}', которая возьмет вашу рабочую разметку и сделает ее недействительной. </p>

Таким образом, изменение метода вывода совершенно бесполезно, и единственный способ создать работающий HTML с XSLT:

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

б. пост-процесс с чем-то вроде HTMLTidy.

Как печально и неаккуратно, что это не было решено даже в XSLT 2.0.

2 голосов
/ 08 октября 2009

Создать комментарий XML внутри <script>:

<script type="text/javascript" src="..." ><xsl:comment/></script>

Вывод будет:

<script type="text/javascript" src="..."><!-- --></script>

, что семантически эквивалентно пустому <script>.

1 голос
/ 04 августа 2010

имел такую ​​же проблему. сейчас это мое решение:

<xsl:text disable-output-escaping="yes">
  <![CDATA[<script type="text/javascript" src="" ></script>]]>
</xsl:text>
0 голосов
/ 08 ноября 2014
  <xsl:output method="html" omit-xml-declaration="yes" doctype-system="about:legacy-compat" encoding="utf-8"/>

должен решить вашу проблему

0 голосов
/ 08 октября 2009

Просто отсутствует закрытие </script>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...