簡體   English   中英

XSLTProcessor :: transformToXml()ID *已經定義

[英]XSLTProcessor::transformToXml() ID * already defined

首先,我不是服務器管理員,而是一名試圖找出問題出處的開發人員,以此作為開頭。

我們托管許多網站的服務器今天由管理它的公司(同時執行其他工作)升級。 升級最終破壞了我們的許多站點(大約30多個),這些站點現在引發XSLT錯誤。

大多數站點都建立在使用XSLT模板生成(X)HTML的Symphony CMS(而非symfony)上。

在更新之前,我們設法在同一頁面上以相同的值輸出多個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

在cPanel中使用EasyApache升級時,我最近也遇到了這個問題。 不幸的是,我有一個大型代碼庫,由於此問題而失敗。

到目前為止,我發現的唯一可行的解​​決方案是降級libxml版本,我希望兼容性標記可用,該標記允許遺留代碼像以前一樣起作用。

XHTML是HTML的超嚴格版本,這就是為什么我要使用它,而這些游戲都不是“噢,您有可怕的代碼,但我會讓它完全滑下來”。 當您擁有兩個或多個具有完全相同值的id屬性時,腳本編寫將出現嚴重問題。 與Gecko(Firefox)不同,后者會拒絕加載頁面並向您顯示錯誤,多個匹配的id屬性/值對將創建安靜錯誤,這是最嚴重的錯誤。

如果您不是通過JavaScript加載內容,則只需查看源代碼並查看id屬性(查找全部/突出顯示)並檢查值是一回事。 如果要將XML加載(不能通過AJAX加載XHTML,只能將XML通過AJAX加載到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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM