XSLTProcessor :: transformToXml()ID *已经定义

时间:2014-09-17 14:31:01

标签: php html xml xslt xhtml

我会先说这不是服务器管理员,而是开发人员试图找出问题所在。

我们的服务器托管着不少网站,今天由管理它的公司进行升级(同时执行其他工作)。升级最终破坏了我们的许多网站(大约30多个),这些网站现在正在抛出XSLT错误。

大多数网站都是基于symphony CMS(不是symfony)构建的,它使用XSLT模板生成(X)HTML。

在更新之前,我们设法在同一页面上输出具有相同值的多个ID(例如,id ='abc',我知道,无效 - 暂时忽略它)。关键是它工作没有造成错误。

升级后,当遇到多个id值时,网站都会抛出错误。例如:

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值。

我的问题是,有没有人以前见过这个或知道可能导致它的原因,以及恢复它或强制它忽略多个id值的适当步骤是什么?

在这个阶段没有真正的选择来回滚更改(因此服务器管理员会说)或修复网站(因为它需要太长时间)。

任何想法都赞赏。


2014年11月24日编辑:看起来这是libxml v2.9.1中的一个问题,而不是像我原先想象的那样的libxslt问题。我假设将libxml的版本降级为<如果您有可用的选项,则v2.9.1和重新编译将起作用。

我还将错误报告记录到xml [at] gnome.org

2 个答案:

答案 0 :(得分:1)

在cPanel中使用EasyApache进行升级时,我最近也遇到过这个问题。不幸的是,由于这个问题我有一个很大的代码库。

到目前为止我找到的唯一可行解决方案是降级libxml版本,我希望可以使用兼容性标志,以便遗留代码能够像以前一样运行。

答案 1 :(得分:0)

XHTML是HTML的超严格版本,这就是为什么我使用它,没有这些"哦,你有可怕的代码,但我完全让它滑动&#34 ;游戏。当您有两个或更多具有完全相同值的id属性时,脚本将会出现严重问题。与Gecko(Firefox)不同,它会拒绝加载页面并向您显示错误,多个匹配的id属性/值对会产生安静错误,这是最糟糕的错误。

如果您没有通过JavaScript加载内容,那么只需查看源代码并查看id属性(查找全部/突出显示)并检查值是一回事。如果您正在加载XML(您无法通过AJAX加载XHTML,只能通过AJAX将XML加载到XHTML中)到应用程序,那么找到您开始搞乱responseXML的位置并使用我的脚本来检测重复的ids。

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;
}