Я предвосхищу это, говоря, что я не администратор сервера, а разработчик, пытающийся выяснить, что пошло не так.
Наш сервер, на котором размещено немало веб-сайтов, сегодня был обновлен компанией, которая управляет им (при выполнении других работ). В результате обновления были повреждены многие наши сайты (около 30+), которые теперь выдают ошибки XSLT.
Большинство сайтов построены на симфонической CMS (не symfony), которая использует XSLT-шаблоны для генерации (X) HTML.
Перед обновлением нам удалось вывести несколько идентификаторов на одной странице с одним и тем же значением (например, id = ‘abc’, я знаю, недопустимо — пока игнорируйте это). Дело в том, что он работал без ошибок.
После обновления все сайты теперь выдают ошибки, когда встречаются несколько значений идентификаторов. например:
ID abc already defined
Одно из обновлений, которое, как я убежден, вызывает ошибку, было для версий libxslt, libxml и libexslt. Прежде чем мы использовали:
libxslt Version => 1.1.26
libxslt compiled against libxml Version => 2.7.8
libexslt Version => 1.1.26
С момента обновления:
libxslt Version => 1.1.28
libxslt compiled against libxml Version => 2.9.1
libexslt Version => 1.1.28
Я догадываюсь, что теперь он обрабатывает XHTML как XML, а не HTML, как это делалось ранее, и XMl не допускает использования нескольких значений ID.
Мой вопрос: кто-нибудь видел это раньше или знает, что может быть причиной, и каковы соответствующие шаги, чтобы либо отменить его, либо заставить его игнорировать несколько значений идентификаторов?
На данном этапе нет реальной возможности откатить изменения (так говорят администраторы сервера) или исправить сайты (так как это займет слишком много времени).
Любые идеи приветствуются.
РЕДАКТИРОВАТЬ 24 НОЯБРЯ 2014 ГОДА: Похоже, это проблема в libxml v2.9.1, а не проблема libxslt, как я изначально думал. Я предполагаю понижение версии libxml до < v2.9.1 и перекомпиляция будет работать, если у вас есть эта опция, доступная для вас.
Я также зарегистрировал сообщение об ошибке на xml [at] gnome.org
У меня также недавно была эта проблема при обновлении с использованием EasyApache в cPanel. К сожалению, у меня есть большая кодовая база, которая терпит неудачу из-за этой проблемы.
Единственное работающее решение, которое я нашел до сих пор, — это понижение версии libxml, я надеюсь, что может появиться флаг совместимости, который позволяет унаследованному коду функционировать как прежде.
XHTML — это очень строгая версия HTML, и именно поэтому я использую ее, нет ни одной из этих игр типа «о, у вас ужасный код, но я полностью позволю этому скользить». Когда у вас есть два или более id
Атрибуты с точно таким же значением будут иметь серьезные проблемы со сценариями. В отличие от Gecko (Firefox), который откажется загружать страницу и покажет вам несколько совпадений ошибок id
пары атрибут / значение создадут тихие ошибки, худший вид ошибок.
Если вы не загружаете вещи через JavaScript, просто просмотрите исходный код и посмотрите на id
атрибуты (найти все / выделить) и проверка значений — это одно. Если вы загружаете XML (вы не можете загрузить XHTML через AJAX, только XML в XHTML через AJAX) в приложение, найдите место, где вы начинаете возиться с responseXML
и использовать мой скрипт для обнаружения дубликатов идентификаторов.
if (xmlhttp.responseXML)
{
if (ajax_id_duplication_prevention(xmlhttp.responseXML))
{
//no duplicate ids detected.
}
}
Сценарий…
function ajax_id_duplication_prevention(xml)
{
var re = true;
if (id_(xml.firstChild.id)) {re = false;}
else if (typeof document.createTreeWalker=='function')
{
var idz = [];
try
{
var walker = document.createTreeWalker(xml,NodeFilter.SHOW_ELEMENT,null,false);
while (walker.nextNode())
{
if (walker.currentNode.id==undefined && walker.currentNode.nodeName=='parsererror') {error_handler(arguments.callee.toString().match(/function ([^\(]+)/)[1],JSON.stringify(arguments),2,'Error: a parser error was detected.\n\nThis may or may not afflict the content being loaded.\n\nIf the content does not load correctly reload the entire page.');}
else if (walker.currentNode.id==undefined) {alert('walker.currentNode.nodeName = '+walker.currentNode.nodeName+'\n\n'+document.serializeToString(xml));}
else if (walker.currentNode.id!='')
{
var n = id_(walker.currentNode.id);
if (n)
{
var l = id_('liquid');
for (var i=0; i<l.childNodes.length; i++)
{
var c = l.childNodes[i];
if (n.compareDocumentPosition(c)==10)
{
element_del(c);
/*Do AJAX report to DB table: id error log*/
break;
}
}
break;
}
else if (in_array(walker.currentNode.id,idz))
{
error_handler(arguments.callee.toString().match(/function ([^\(]+)/)[1],JSON.stringify(arguments),2,'Error: can not import XML, the id \''+walker.currentNode.id+'\' was detected twice in the layer being imported.\n\nDuplicated ID\'s break expected functionality and are illegal.\n\nWhile the XML content was not imported it is still possible that the related request was successful.');
re = false;
break;
}
else {idz.push(walker.currentNode.id);}
}
}
}
catch (err) {}/*IE9*/
}
return re;
}