Для записи я использую Windows XP SP3, работающий с FireFox 5 и IE 8.
Я работаю над проектом, использующим код из каменных веков, пытаюсь его реорганизовать, модернизировать. Он работал только в IE и предполагает интенсивное использование XML и XSLT.
Когда страница загружается, содержимое динамически помещается в div с использованием предварительной обработки XSLT и XML. Этот контент состоит из img, map и тега input, который извлекается из файла XSL. Это прекрасно работает как в Firefox, так и в Internet Explorer; он загружается нормально, и изображение отображается правильно с правильными отображениями, используя атрибут usemap на img.
Есть поле выбора, которое позволяет пользователю загружать другое изображение - вот где у меня проблемы. Когда пользователь делает выбор в поле выбора, он отражает шаги, когда страница впервые загружалась: XSLT, через объект XML и файл XML. По сути, содержимое div перезагружается.
Это хорошо работает в Internet Explorer (IE); однако FireFox вообще не трансформируется.
Я нашел плагин преобразования jquery, и вот строка кода, которую я использую:
function TransformXML()
{
var html = null;
var XML_Image = null;
// Load XML document into XML_Image and do manipulation on it before transformation
// ...
// Further down in the function..
if (document.implementation && document.implementation.createDocument)
{
html = $.transform({async:false, xmlobj:XML_Image, xsl:"xsl/ImageData.xsl"});
document.getElementById("DivContent").appendChild(html);
}
else
{
html = $.transform({async:false, xmlobj:XML_Image, xsl:"xsl/ImageData.xsl"});
document.getElementById("DivContent").innerHTML = html;
}
}
Как я уже сказал, IE работает нормально. К сожалению, значение переменной html является пустым (FireBug сообщает ""). В чем может быть проблема ???
Файл XSL действительно использует XSL: import, но плагин преобразования jquery прекрасно работал для IE; Я не знаю, нравится ли ему FireFox (FireBug ужасен при отладке XSLT).
Заранее спасибо за любую помощь!
UPDATE
Я определил, что это что-то с файлом XSL. Я попытался использовать образец XML и XSL-файла из плагина преобразования jquery, и это сработало. Затем я попытался использовать свой объект XML, XML_Image и образец файла XSL, и это тоже сработало. Наконец, я попытался использовать образец XML-файла и мой XSL-файл ImageData.xsl, но он не сработал. Однако я не уверен, что не так с файлом XSL.
UPDATE2
Ну, я думаю, что-то с файлом XSL. Вот оно:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template name="chgBR">
<xsl:param name="str"/>
<xsl:choose>
<xsl:when test='$str = ""'>
<br/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="str"/>
<xsl:param name="src"/>
<xsl:param name="dst"/>
<xsl:if test='$str != ""'>
<xsl:choose>
<xsl:when test='substring-before( $str, $src ) = "" '>
<xsl:value-of select='$str'/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select='substring-before( $str, $src )'/>
<xsl:choose>
<xsl:when test='$dst = "<br/>"'>
<xsl:element name="br"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select='$dst'/>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name='replace'>
<xsl:with-param name='str' select='substring-after( $str,$src )'/>
<xsl:with-param name='src' select='$src'/>
<xsl:with-param name='dst' select='$dst'/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="Figure" />
</xsl:template>
<xsl:template match="Figure">
<input type="hidden" name="pdfpath" id="pdfpath">
<xsl:attribute name="value">Catalog/PDF/<xsl:call-template name='replace'>
<xsl:with-param name='str' select='./nm_pdf'/>
<xsl:with-param name='src' select='" "'/>
<xsl:with-param name='dst' select='"%20"'/>
</xsl:call-template>
</xsl:attribute>
</input>
</xsl:template>
</xsl:stylesheet>
Update3
Я скачал редактор XML в надежде, что он сможет отладить мои файлы XML и XSL и выполнить его преобразование вне браузера. Файл XSL оказался в порядке; Итак, я вернулся к тестированию, был ли XML каким-то образом поврежден. Как оказалось, редактор XML смог преобразовать файл XML, используя файл XSL. Я могу сказать, что файл XML содержит символы английского и восточноазиатского языков, закодированные как UTF-8. Но IE смог проанализировать и преобразовать его, а также редактор XML. Итак, возможно, у Firefox есть проблема с кодировкой UTF-8 XML-файлов?
Не имея ответа на эту проблему, я попробовал это:
if (window.DOMParser)
{
var serializer = new XMLSerializer();
var XMLString = serializer.serializeToString(XML_Image);
var parser = new DOMParser();
var XML_Image_Again = parser.parseFromString(XMLString, "text/xml");
}
var Works = $.transform({async:false, xmlobj:XML_Image_Again, xsl:"xsl/ImageData.xsl"});
var AlsoWorks = $.transform({async:false, xmlstr:XMLString, xsl:"xsl/ImageData.xsl"});
Works = Works.replace(/"/g,"\"");
Works = htmlfixed.replace(/(.gif).*?\"/g,"$1\"");
document.getElementById("DivContent").innerHTML = Works;
Я сделал сериализацию XML в строку. Затем я проанализировал строку и попытался преобразовать ее обратно в объект XML DOM. По какой-то причине в ней осталась строка. В результате Works принимает значение строки. Кроме того ,Works * также принимает значение строки, но это желаемый результат. Что странно, после того, как я преобразовал XML и передал его в Works , большинство символов кавычек испортилось, а некоторые другие данные были добавлены в конец изображения, которое я получаю (.gif). Поскольку Works является строкой, я не мог использовать метод appendChild, чтобы присоединить ее к дереву DOM. У меня не было выбора, кроме как использовать innerHTML, что я и сделал.
Все это время и энергия, потому что проект, с которым я работаю, укоренен в файлах XML и XSL.
Я обнаружил, что этот блог также описывает трудности с FireFox и XSLT / XML / XSL:
http://ajaxandxml.blogspot.com/search/label/Firefox
Теперь работает, но я все еще чешу голову.В начале я упомянул, что в IE все работает нормально.И, что еще важнее, он работает в ОБА FireFox и IE, когда я впервые присоединяю контент к div, что происходит при инициализации страницы.Только в последующие раз я присоединяю контент к div, что FireFox не взаимодействует (и Firebug не сильно помогает и не сообщает об ошибках, в отличие от панели инструментов веб-разработчика IE).И после инициализации я даже не использую jquery, просто нативный DOM.И все же, когда я использовал примеры пар файлов XML и XSL из плагина преобразования jquery, они работали нормально.Только когда я использую оба моих XML и XSL-файла вместе, он жалуется (опять же, не при первой загрузке страницы).Странно то, что он не будет преобразовывать объект XML, но после его сериализации преобразование заработало нормально.
Слишком много вопросов.Я говорю, что это, вероятно, FireFox, а не XML или XSL, потому что, если файлы XML и XSL были ошибочными, преобразование должно завершиться неудачей, когда страница загружается, и, тем не менее, нет.
Я уверен, что, черт возьмиХотелось бы знать, почему добавление объекта в div не работает, но сериализация объекта в строку и установка его в свойстве innerHTML после преобразования передаются с плавающими цветами.
UPDATE4
В своем XSL-файле я поместил первые два шаблона в отдельный XSL-файл и вместо этого использую функцию xsl: import.Это сломало это снова.Таким образом, плагин FireFox и jquery transform плохо реагирует на функцию xsl: import (IE не имеет проблем с этим).Я попытался использовать примеры файлов XML и XSL из плагина транспорта, пример, который указывает, как использовать xsl: import, и он не удался в Firefox.
UPDATE5
Я реорганизовал код, чтобы он не использовал jquery, чтобы выяснить, не удастся ли выполнить xsl: import.
// Test for Firefox only, purposely not including IE code
function TransformNodeTest(xmlobj, xslpath)
{
var xslobj = LoadXSML(xslpath);
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslobj);
return(xsltProcessor.transformToFragment(xmlobj, document));
}
function LoadXSML(xslpath)
{
var xhttp=new XMLHttpRequest();
xhttp.open("GET",xslpath,false);
xhttp.setRequestHeader("Pragma", "no-cache");
xhttp.send();
return xhttp.responseXML;
}
// ImageData.xsl contains xsl:import statement
// XML_Image is an XML obj
var FireFoxHTML = TransformNodeTest(XML_Image, "xsl/ImageData.xsl");
Он работал нормально.
Выводы по замене содержимого XML / XSL в divс содержимым XML / XSL -
плагин преобразования jquery ::
IE: отлично работает;Нет проблем с функцией xsl: import в файле xsl.
FireFox: Не нравится функция xsl: import по неизвестной мне причине (мне).Мой временной пробел, пока не появится лучшее решение, - это скопировать / вставить все операторы XSL в один файл и не использовать xsl: import.Кроме того, необходимо сериализовать объект XML и, при необходимости, проанализировать его обратно в объект XML для преобразования.Почему сериализация это исправляет?Я не знаю.
XML DOM ::
IE: Работает нормально;нет проблем с функцией xsl: import в файле xsl.
FireFox: нет проблем с функцией xsl: import.Нужно сериализовать объект XML и, при необходимости, проанализировать его обратно в объект XML для преобразования.Почему сериализация это исправляет?Я не знаю.
Повторюсь, когда страница загружается изначально, XSLT проводится на div и работает нормально в FF и IE.Это только в последующие моменты времени происходит сбой в FF (но не в IE).