Почему // span [2] не выбирает второй интервал в документе? - PullRequest
3 голосов
/ 24 января 2011

У меня есть следующий html:

<!doctype HTML>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Test</title>
</head>
<body>

<p>A <span>one</span></p>

<p>B <span>two</span></p>

<p>C <span>three</span></p>

<p>D <span>four</span></p>

</body>
</html>

При запуске XPath //span[1] получает первый диапазон.Однако //span[2] возвращает ноль:

 input: document.evaluate("//span[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
output: <span>​one​</span>​

 input: document.evaluate("//span[2]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
output: null

Почему это происходит?

Ответы [ 2 ]

6 голосов
/ 24 января 2011

[2] имеет более высокий приоритет, чем //.Вы должны прочитать исходный запрос xpath следующим образом:

//(span[2])

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

2 голосов
/ 24 января 2011

Потому что //span[1] относится к первому элементу span родителя диапазона. Есть 4, которые соответствуют этому критерию (все 4). Вы видите только один из-за использования .singleNodeValue

//span[2] запрашивает промежутки, которые являются вторым дочерним элементом их родителей.

Попробуйте это с этим телом, чтобы увидеть

<body>
<p>A <span>one</span></p>
<p>B <span>two</span></p>
<p>C <span>three</span></p>
<p>D <span>four</span><span>five</span></p>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...