0

У меня есть объект XSL. Я хочу извлечь выбранную группу узлов. Другой человек или команда написал XSL-документ и строку кода, которая выбирает эти узлы, но она работает только в IE, и я пытаюсь сделать ее совместимой с кросс-браузером.jQuery Selector escaping colon ":" работает в IE, но не работает в другом месте

XSL файл

<!-- snippet of XSL file --> 
<xsl:variable name="title">aaa</xsl:variable> 

<xsl:variable name="col1">CSV00001</xsl:variable> 
<xsl:variable name="col2">CSV00002</xsl:variable> 
<xsl:variable name="col3">CSV00003</xsl:variable> 
<xsl:variable name="col4">CSV00004</xsl:variable> 
<xsl:variable name="col5">CSV00005</xsl:variable> 
<xsl:variable name="col6">CSV00006</xsl:variable> 
<xsl:variable name="col7">CSV00007</xsl:variable> 
<xsl:variable name="col8">CSV00008</xsl:variable> 
<xsl:variable name="col9">CSV00009</xsl:variable> 

JS файл

// Extract title and column nodes 
var varNodes = $(csvXsl).find("xsl\\:variable"); 

Я попытался ссылки в этой статье идеи, Handling a colon in an element ID in a CSS selector, но это для CSS. Но я попытался заменить \: на \\3A, \\3a, 3a, 3A и никто из них не работал.

Любые предложения?

В соответствии с запросом здесь приводится подробная информация о том, как создается объект XSL.

function loadXml(xmlFilePath) { 
    var retObj = null ; 
    var timeUniq = (new Date()).getTime(); 

    // check protocol 
    var protocol = document.location.protocol; 
    if(protocol.toLowerCase().indexOf("http")>=0){ 
     $.ajax({ 
      url: xmlFilePath + "?t=" + timeUniq, 
      type: 'get', 
      dataType: 'xml', 
      async: false, 
      timeout: 1000 
     }) 
      .done(
       function(xml, status){ 
        if(status != 'success'){ 
         return; 
        } 
        retObj = xml; 
       }) 
      .fail(
       function(xhr, textStatus){ 
        return; 
       }); 
    } 

    return retObj; 
} 

csvXsl = loadXml("./xsl/OrderListCSV.xsl"); 

спасибо.

Update

В соответствии с просьбой, я добавил скрипку.

http://jsfiddle.net/Q3jNN/

Update2

Рабочая JSFiddle процедура со всем кредитом комментатор Нит.

http://jsfiddle.net/dNDN6/2/

В случае связь прерывается, вот соответствующая часть:

// Workaround for JQuery bug, primarily using Vanilla JS. 

function serializeXmlNode(xmlNode) { 
    if (typeof window.XMLSerializer != "undefined") { 
     return (new window.XMLSerializer()).serializeToString(xmlNode); 
    } else if (typeof xmlNode.xml != "undefined") { 
     return xmlNode.xml; 
    } 
    return ""; 
} 

var tmpStr = serializeXmlNode(csvXsl); // Converts XML/XSL object to String 
var tmp = document.createElement('div'); 

tmp.innerHTML = csvXsl; // Does not work 
tmp.innerHTML = tmpStr; // This one works, had to serialize object first 

var varNodes = tmp.getElementsByTagName('xsl\:variable'); // Works 
var varNodes2 = tmp.getElementsByTagName('xsl:variable'); // Also works 
+0

Что входит в переменную 'csvXsl'? – jfriend00

+1

Что на самом деле происходит при запуске кода в других браузерах? Вы получаете конкретную ошибку, сообщаемую в консоли браузера, или ...? – nnnnnn

+0

'csvXsl' - это объект XSL, созданный из файла XSL выше. – user717236

ответ

1

Я хотел бы сделать несколько шагов, чтобы отладить этот вопрос:

  1. Проверьте содержимое переменной csvXls, вы можете попробовать, например, искать: console.log(csvXsl) затем $(csvXsl).find("xsl\\:variable"); или $("xsl\\:variable",csvXsl);

  2. Если эта переменная содержит правильные узлы, например <xsl:variable name="col9">CSV00009</xsl:variable>, то это может быть ошибка в JQuery, который я чувствую, чтобы исключить в такой основной селектор.

  3. Сообщение, как вы получите csvXsl с немного более контекстом, чтобы мы могли помочь вам лучше.

+3

Разве вы не должны объяснять, почему это было бы иначе? – jfriend00

+0

Я обновил свой ответ с более подробной информацией о том, как отладить эту проблему. –

+0

Спасибо. Да, я могу просмотреть содержимое объекта csvXsl в консоли и увидеть, что объект верен и выглядит точно так же, как в IE. Я попробовал обе формы метода find, и он возвращает '[]'. Однако, если я использую '$ (csvXsl) .find (" variable ")', он находит узлы. Таким образом, это может быть ошибка в jQuery. Опять же, я не видел, чтобы эта проблема возникала в IE. – user717236

1

Это действительно ошибка в jQuery.

Попробуйте использовать Vanilla JS вместо:

var tmp = document.createElement('div'); 
tmp.innerHTML = csvXsl; 
var varNodes = tmp.getElementsByTagName('xsl:variable'); 
+0

спасибо. Я LOL'd из этой ссылки Vanilla JS. Пожалуйста, посмотрите здесь процедуру JSFiddle -> http://jsfiddle.net/dNDN6/2/. Мне пришлось сериализовать объект XSL, а затем установить его в tmp.innerHTML, чтобы заставить его работать. Спасибо за вашу помощь! – user717236

0

должен комментарий по 'Ответ', так как не достаточно повторений

линия:

var inputTag = $("#test\\:1").val()); 

в скрипку якобы показывая, что работает: http://jsfiddle.net/dNDN6/2/

фактически не работает в Chrome/WebKit

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

var x = xmlDoc.getElementsByTagName("variable"); 
if (!x[0]) x = xmlDoc.getElementsByTagName('xsl:variable'); 

x будет содержать ваш массив [кросс-браузер]

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