Я хочу преобразовать узлы HTML со страницы XHTML с помощью таблицы стилей XSL.
вот функция, которую я использую:
function XSLT(xml,xsl) {
var tmpElt = document.createElement("div");
if (window.ActiveXObject){
//Version IE
tmpElt.innerHTML = xml.transformNode(xsl);
}else{
//Version ECMA
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
var result = xsltProcessor.transformToFragment(xml, document);
var serializer = new XMLSerializer();
var str = serializer.serializeToString( result );
tmpElt.innerHTML = str;
}
return tmpElt;
}
это будет работать на chrome, если xml не является HTMLElement. именно эта строка:
var result = xsltProcessor.transformToFragment(xml, document);
возвращает ноль для хрома [большую часть времени]. На Firefox он ведет себя правильно.
Я пробовал этот обходной путь:
- сериализация xml с externalHTML (и даже с XMLSerializer :: serializeToString ())
- Разобрать его с помощью нового DOMParser ()
- XSLT результат
но, к сожалению, outerHTML и innerHTML не будут генерировать правильный XHTML и не будут отображать действительный XML (он не будет закрывать отдельные теги, такие как <hr />
). XMLSerializer также не будет закрывать отдельные теги, что довольно удивительно для меня.
Я заметил, что преобразования узлов HTML будут работать исключительно, когда фактический HTML не содержит самозакрывающихся тегов. Поэтому я предполагаю, что Chrome внутренне сериализует HTML с XMLSerializer или outerHTML до XSLT.
Вот JSFiddle: http://jsfiddle.net/eVbv7/
Итак, как я могу XSLT HTML-узлы в Chrome? Мне нужен либо способ для правильной сериализации узлов XHTML, либо подойдет любой обходной путь.