2012-03-22 5 views
2

У меня есть документ XHTML. Я использую XHR для импорта другого XML-документа, который должен быть XHTML, за исключением того, что автор забыл положить xmlns в корневой каталог. Таким образом, все узлы в XML-документе не имеют пространства имен.Изменение пространства имен узла DOM до/во время/после импорта

Когда я импортирую узел из этого другого документа и добавлю его в свой документ, я получаю узел, который выглядит правильно (например, <h1>Hi Mom!</h1>), но у которого нет пространства имен. Таким образом, веб-браузер применяет display:inline.

я мог бы исправить это с помощью кода, как следующее (непроверенные) ... но я предпочел бы не так, если лучший маршрут существует:

function changeNodeNamespace(node,namespace){ 
    var dup = document.createElementNS(namespace,node.nodeName); 
    if (node.hasAttributes()){ 
    for (var a=node.attributes,i=a.length;i--;){ 
     dup.setAttributeNS(a[i].namespaceURI,a[i].nodeName,a[i].value); 
    } 
    } 
    if (node.hasChildNodes()){ 
    for (var a=node.childNodes,i=0,len=a.length;i<len;++i){ 
     if (a[i].nodeType==1){ // ELEMENT_NODE 
     dup.appendChild(changeNodeNamespace(a[i],namespace)); 
     }else{ 
     dup.appendChild(a[i].cloneNode(false)); 
     } 
    } 
    } 
    return dup; 
} 

Кроме пересочинения документы я импортировать, чтобы иметь правильное пространство имен, или -рекурсивное воссоздание каждого элемента/атрибута/textnode в новом пространстве имен на основе оригиналов, можно ли импортировать сами элементы и каким-то образом изменить их пространство имен на http://www.w3.org/1999/xhtml?

+0

Можете ли вы изменить пространство имен по умолчанию на XHTML и использовать пространство имен для всего остального? Существует также [createElementNS] (http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-DocCrElNS) для создания элементов в определенном пространстве имен. – RobG

+0

@RobG Документ хоста имеет пространство имен XHTML по умолчанию. Загруженный документ не работает, и в этом проблема. Если я отредактирую этот документ, чтобы иметь пространство имен XHTML по умолчанию (таким образом, применяя пространство имен ко всем потомкам), все работает нормально. Возникает вопрос: _если я загружаю XML-документ с узлом в «неправильном» пространстве имен, существует ли способ их переноса без использования рекурсивных 'createElementNS' и' setAttribute' и 'createTextNode' и т. Д. Для создания подобных узлов в другом namespace? _ – Phrogz

ответ

1

XSLT может do the trick, а библиотека, такая как Sarissa или AJAXSLT, может помочь упростить синтаксис JavaScript.

+0

Какое интересное предложение! Используйте XSLT для преобразования элемента в новый. Tricky; не совсем то, что я искал, вы, но вы наверняка получите +1 для ссылки AJAXSLT (настоящий XPath в JS? Joy!). – Phrogz

Смежные вопросы