【问题标题】:XSLTProcessor::transformToXml() ID * already definedXSLTProcessor::transformToXml() ID * 已定义
【发布时间】:2014-11-11 15:45:12
【问题描述】:

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

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

大多数网站都建立在 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 的版本降级到

我还向 xml[at]gnome.org 记录了一个错误报告

【问题讨论】:

  • 你能解决这个问题吗?如果是这样怎么办?
  • 服务器被更新为使用 libxslt 的开发版本,其中包含对功能的更改或错误。服务器已更新/回滚。对 libxslt 更改的调查仍在进行中。

标签: php html xml xslt xhtml


【解决方案1】:

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

到目前为止,我发现的唯一可行的解​​决方案是降级 libxml 版本,我希望可以提供一个兼容性标志,允许旧代码像以前一样运行。

【讨论】:

  • 我问了很多,你是我能找到的第一个遇到同样问题的人。我们现在在 2 台单独的服务器上经历了两次(其中一台有 30-40 个站点,都受到影响)。我很确定它只是 easyapache 版本,因为我在本地使用 1.1.28 工作。希望可能是他们的 libxslt/libxml 版本中的一个错误,而不是它未来的运行方式。
  • 我(非常)最近遇到了完全相同的问题。今天用 cPanel 设置一个全新的服务器,并将一个运行良好的站点复制到新服务器上——现在在新服务器上得到了这个错误。不知道(到目前为止)如何排序。
  • 看起来这是 libxml v2.9.1 中的问题,而不是我最初认为的 libxslt 问题。我已经更新了我上面的原始评论
【解决方案2】:

XHTML 是 HTML 的超严格版本,这就是我使用它的原因,没有这些“哦,你的代码很糟糕,但我会完全让它滑动”的游戏。当您有两个或多个具有完全相同值的id 属性时,脚本编写将出现严重问题。与 Gecko (Firefox) 不同,后者会拒绝加载页面并向您显示错误,多个匹配的 id 属性/值对会产生静默错误,这是最严重的错误。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2012-06-27
    • 1970-01-01
    相关资源
    最近更新 更多