Конвертировать XPath в Node - PullRequest
       3

Конвертировать XPath в Node

2 голосов
/ 01 марта 2012

Мне интересно, как преобразовать XPath в объект Node?

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь создать объект Range и установить диапазон с помощью XPath. Ниже приведен код, который я написал, но, насколько я понимаю, он не будет работать, потому что setRange () и setEnd () нуждается в объекте Node в качестве первого параметра.

var range = document.createRange();
range.setStart(startXPath, startOffset);
range.setEnd(endXPath, endOffset);

РЕДАКТИРОВАТЬ: Вот как я получаю свой XPath:

function grabSelection() {
    var selection = window.getSelection();
    var range = selection.getRangeAt(0);

    var selectObj = {
        'startXPath': makeXPath(range.startContainer), 
        'startOffset': range.startOffset, 
        'endXPath': makeXPath(range.endContainer), 
        'endOffset': range.endOffset 
   }

   return selectObj
}


function makeXPath (node, currentPath) {
  currentPath = currentPath || '';
  switch (node.nodeType) {
    case 3:
    case 4:
      return makeXPath(node.parentNode, 'text()[' + (document.evaluate('preceding-sibling::text()', node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']');
    case 1:
      return makeXPath(node.parentNode, node.nodeName + '[' + (document.evaluate('preceding-sibling::' + node.nodeName, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']' + (currentPath ? '/' + currentPath : ''));
    case 9:
      return '/' + currentPath;
    default:
      return '';
  }
}

1 Ответ

1 голос
/ 01 марта 2012

Предполагая, что то, что вы называете "XPath", является результатом запроса XPath, это возвращает DOMNodelist, поэтому вы должны установить

startXPath to XPathResult[0] 

и

endXPath to XPathResult[XPathResult.length-1]

(гдеXPathResult - это список узлов, возвращаемый XPath-> запросом)


Редактирование, связанное с комментарием

Поскольку startXPath и endXPath действительно являются XPath, вам необходимо оценить их, чтобы получить узлы:

  var startXPath = document.evaluate(startXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
  var endXPath = document.evaluate(endXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);

Можете ли вы объяснить, что вы пытаетесь достичь, может быть, есть лучший подход?

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