Проблема
Я конвертирую относительно большой кусок 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()
, и наш код не использует это, я думаю, что этот конкретный случай не будет проблемой.
Вопросы
Я скачал Сарисса , чтобы увидеть, есть ли у них способ решить эту проблему, но, посмотрев исходный код, очевидно, что нет?
Я хочу добавить один в версию W3C вместо того, чтобы вычесть один в версии IE, чтобы облегчить процесс конвертации.
В итоге
Мы решили переписать код для использования правильного XPath в IE, установив язык выбора
xmlDoc.setProperty("SelectionLanguage", "XPath");