Как вернуть '' для text() пустого узла в XPath?

<td></td><td>foo</td>

Я хотел бы вернуть ['', 'foo'], но xpath //td/text() libxml возвращает только ['foo']. Как найти пустой тег как '' вместо (не соответствует)?


person joeforker    schedule 10.03.2010    source источник


Ответы (2)


Пока вы выбираете только текстовые узлы, вы не можете этого сделать. Потому что в первом <td> просто нет текстового узла.

Когда вы измените свое выражение XPath на '//td', вы получите два узла <td>. Используйте их текстовое значение в дальнейшей обработке.

person Tomalak    schedule 11.03.2010
comment
В итоге я нашел все узлы td и вызвал для них .text. Не так круто, как делать все в одном большом XPath ;-), но это работает. - person joeforker; 11.03.2010
comment
@joeforker: Пока у вас нет доступа к блестящему XPath 2.0, это ваш единственный вариант. :-) - person Tomalak; 11.03.2010

Хотя @Tomalak совершенно прав, в XPath 2.0 можно использовать:

//td/string(.)

и это создает последовательность строк, каждая из которых содержит строковое значение соответствующего элемента td.

Итак, в вашем случае результат будет желаемым:

"", "foo"

person Dimitre Novatchev    schedule 11.03.2010
comment
+1. Это делает именно то, что делает мое решение для XPath 1.0 — оно берет узлы <td>, а затем использует их соответствующее текстовое значение. - person Tomalak; 11.03.2010