2010-08-06 3 views
0

Я пытаюсь создать функцию, которая будет правильно указывать/удалять атрибут в XPath. Я видел решения, размещенные в C# here и here, но моя реализация в JavaScript приводит к ошибке «Это выражение не является юридическим выражением»Атрибут XPath, цитируемый в 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; 
     } 

Ввод пробы неудачи:

"" привет"

Sample неудачу выход:

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

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

ответ

2

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

Так не должно быть никаких обратных слэша в вашей продукции, это должно выглядеть примерно так:

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

Я предлагаю:

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

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

(? Есть ли на самом деле означает let в выше Это нестандартное Mozilla только функция Langauge, один, как правило, используют var.)

+0

Я разрабатываю приложение клиента с помощью платформы Mozilla. Это не для браузера. Благодарю. – pc1oad1etter

Смежные вопросы