Цитирование атрибутов XPath в JavaScript - PullRequest
0 голосов
/ 06 августа 2010

Я пытаюсь создать функцию, которая будет правильно заключать в кавычки / экранировать атрибут в XPath. Я видел решения, опубликованные в C # здесь и здесь , но моя реализация в JavaScript приводит к ошибке "Это выражение не является допустимым выражением"

Вот моя функция:

function parseXPathAttribute(original){
            let result = null;
            /* If there are no double quotes, wrap in double quotes */
            if(original.indexOf("\"")<0){
                result = "\""+original+"\"";
            }else{
                /* If there are no single quotes, wrap in single quotes */
                if(original.indexOf("'")<0){
                    result = "'"+original+"'";
                }else{ /*Otherwise, we must use concat() */
                    result = original.split("\"")
                    for (let x = 0;x<result.length;x++){
                        result[x] = result[x].replace(/"/g,"\\\"");
                        if (x>0){
                            result[x] = "\\\""+result[x];
                        }
                        result[x] = "\""+result[x]+"\"";
                    }
                    result = result.join();
                    result = "concat("+result+")";
                }

            }

            return result;
        }

Пример неудачного ввода:

" 'привет'"

Пример неудачного вывода:

CONCAT ( "", "\" 'привет' " "\"")]

Я не понимаю, почему это недопустимое выражение (учитывая, что двойные кавычки экранированы), поэтому я не знаю, как исправить функцию.

1 Ответ

2 голосов
/ 06 августа 2010

\ не является escape-символом в строковых литералах XPath. (Если бы это было так, вы могли бы просто убрать одну из кавычек с обратной косой чертой, и вам никогда не пришлось бы беспокоиться о concat!) имеет смысл.

Таким образом, в выводе не должно быть обратной косой черты, он должен выглядеть примерно так:

concat('"', "'hi'", '"')

Я предлагаю:

function xpathStringLiteral(s) {
    if (s.indexOf('"')===-1)
        return '"'+s+'"';
    if (s.indexOf("'")===-1)
        return "'"+s+"'";
    return 'concat("'+s.replace(/"/g, '",\'"\',"')+'")';
}

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

(Вы действительно имеете в виду let в вышеприведенном? Это нестандартная функция языка только для Mozilla; обычно используется var.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...