Я конвертирую относительно большой фрагмент Javascript, который в настоящее время работает только в Internet Explorer, чтобы он работал и в других браузерах. Поскольку в коде широко используется XPath, мы сделали небольшую функцию совместимости, чтобы упростить задачу
function selectNodes(xmlDoc, xpath){
if('selectNodes' in xmlDoc){
//use IE logic
}else{
//use W3C's document.evaluate
}
}
В основном это работает нормально, но мы только что столкнулись с ограничением, что позиции в IE отсчитываются от нуля, но в модели W3C, используемой в остальных браузерах они однопроходные . Это означает, что для получения первого элемента нам нужно выполнить // books [0]
в IE и // books [1]
в других браузерах.
Первой мыслью было использование регулярного выражения для добавления одного ко всем индексам, которые появляются в запросах, если мы используем версию document.evaluate:
function addOne(n){ return 1 + parseInt(nStr, 10); }
xpath = xpath.replace(
/\[\s*(\d+)\s*\]/g,
function(_, nStr){ return '[' + addOne(nStr) + ']'; }
);
Это решение на основе регулярных выражений достаточно безопасно?
Например, он не сможет заменить индекс в ] // books [position () = 1]
, но поскольку IE, похоже, не поддерживает position ()
и наш код не использует это, я думаю, что этот конкретный случай не будет проблемой.
Я загрузил Sarissa , чтобы узнать, есть ли у них способ решить эту проблему, но, посмотрев исходный код, по-видимому, их нет?
Я хочу добавить его в W3C version вместо вычитания единицы в версии IE, чтобы облегчить мои усилия по преобразованию.
Мы решили переписать код, чтобы использовать правильный XPath и в IE, установив язык выбора
xmlDoc.setProperty("SelectionLanguage", "XPath");