Чего я хочу добиться:
- создать объект, выполнив XSL-преобразование (для объекта XML DOM), назовем его «фрагмент»
- , выбрав некоторые узлызапустив XPATH-запрос к результирующему объекту
- , соберите эти узлы, скажем, в массив
- добавьте 'фрагмент' к определенному контейнеру в моем HTML-документе
- измените любойодин из этих узлов, не путем запроса DOM, а путем ссылки на указанный узел следующим образом: nodeCollection [x]
Моя мотивация:
По сути, это способ «кэширования».«объекты, которые я знаю наверняка, мне придется изменить позже.Поэтому вместо того, чтобы ходить по DOM, чтобы найти их каждый раз, когда они мне нужны, я хочу их «кэшировать».Гораздо быстрее выбирать их с помощью запросов XPATH, и как только я это сделаю, мне больше не нужно выполнять обход DOM, который в моем случае может быть довольно медленным (мы говорим много узлов здесь),Я знаю, что в целом это может показаться очень запутанным решением, но в моей конкретной ситуации оно окупается, по крайней мере, в Firefox (см. Ниже).
Как я это сделал в Firefox:
создать фрагмент документа («xml» и «xsl» являются объектами XML DOM):
xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
fragment = xsltProcessor.transformToFragment(xml,document);
XPATH-запрос:
var nodes = document.evaluate("//div", fragment.firstChild, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
собрать узлы в массиве:
nodeCollection = new Array();
i = 0;
node = nodes.iterateNext();
while(node) {
nodeCollection[i] = node;
node = nodes.iterateNext();
i++;
}
добавьте фрагмент к контейнеру в документе HTML:
document.getElementById("container").appendChild(fragment);
измените узел в коллекции:
nodeCollection[0].style.border = '1px solid red';
.. и он будет работать как задумано.
Проблемы, с которыми я столкнулся в Internet Explorer:
Я использовал
var fragmentObject = new ActiveXObject("Msxml2.DOMDocument.3.0");
xml.transformNodeToObject(xsl,fragmentObject);
для создания объекта, для которого я могу выполнять запросы XPATH, например:
var nodes = fragmentObject.selectNodes("//div");
, но после этого шага я не знаю, как добавить «фрагментОбъект» в мой контейнер в документе HTML, а затем выбрать отдельные узлы из «узлов» и манипулировать ими, как я это сделал в Firefox.
То, что я думаю, пошло не так:
'gmentObject '- это Msxml2.DOMDocument.3.0, которыйизначально отличается от фрагмента документа, поэтому я не могу просто переместить узлы из него в мой HTML-документ.Если я пытаюсь что-то вроде
container.appendChild(nodes[1]);
, я получаю эту ошибку: «SCRIPT5022: исключение DOM: HIERARCHY_REQUEST_ERR (3)», что обычно происходит при попытке вставить узел, к которому он не принадлежит (илипо крайней мере, это объяснение, которое я нашел для этой конкретной ошибки).
Может быть, есть какой-то объект, о котором я не знаю, который поддерживает запросы XPATH и могут быть добавлены к документу HTML (?)