Запросы XPath в IE используют индексы с отсчетом от нуля, но спецификация W3C основана на единице. Как мне справиться с этой разницей?

Проблема

Я конвертирую относительно большой фрагмент 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");
6
задан hugomg 24 December 2011 в 01:59
поделиться