См. Ответ @ Martin для ключевого момента: действительные шаблоны являются только подмножеством действительных выражений XPath .(Это что-то в XSLT, что мне потребовалось много времени, чтобы понять.)
Что касается допустимых альтернатив:
//(X|Y|Z)/AABBCC
- допустимое выражение в XPath 2.0, но не в 1.0,потому что скобки не могут начинаться сразу после оси //
.Но в 1.0
(//X|//Y|//Z)/AABBCC
является допустимым альтернативным выражением (но все еще не является допустимым шаблоном).Допустимый, но несколько неуклюжий шаблон будет
*[contains('X Y Z', local-name())]/AABBCC
или
*[self::X | self::Y | self::Z]/AABBCC
Что касается
(book/author)[last()]
, допустимый шаблон будет
(book/author)[not(following::author[parent::book])]
(Но, конечно,
(book/author)[not(following::book/author)]
не будет эквивалентным, потому что он будет соответствовать всем <author>
дочерним элементам последних <book>
, которые имели какие-либо.)