XPath.compile
компилирует выражения XPath, а не выражения Regex. Они совершенно не связаны.
Выражение XPath //*[not(*)]
выбирает все элементы в документе, которые не имеют дочернего элемента (то есть все конечные элементы). Это работает следующим образом:
//
расширяется до /descendant-or-self::node()/
*
расширяется до child::element()
not(X)
, где X
является набором узлов, проверяет, является ли набор узлов пустым.
Таким образом, выражение означает
/descendant-or-self::node()/child::element()[empty(child::element())]
, который выбирает все элементы, которые являются потомками чего-либо в document (на самом деле, все элементы являются дочерними элементами чего-либо), а затем фильтрует этот набор, чтобы сохранить только те, где child::element()
ничего не возвращает, то есть те, которые не имеют дочерних элементов.
Но сначала вам нужно Выкиньте из головы, что это имеет отношение к регулярным выражениям. Если вы ищете учебник по Regex в надежде получить представление о XPath, вы очень запутаетесь.