Это на самом деле очень тонкая проблема, и я думаю, что отличный вопрос.
Насколько я понимаю, (сокращенно) XPATH указывает на атрибут, если и только его последний @
не находится в предикате, то есть что-то в форме [...]
и не имеет шаги после него (что-то вроде /...
). Я думаю, что это имеет относительно простое регулярное выражение @[^]/]*$
, то есть должно быть @
, которое не имеет ни ]
с, ни /
с после него. Кроме того, если вы хотите использовать несокращенные XPATH, вы можете использовать (@|attribute::)[^]/]*$
Я включил тестовый комплект, который может оказаться полезным при проверке этого или других тестов. Также обратите внимание, что между токенами могут быть пробелы, которые могут усложнять некоторые регулярные выражения.
Позитив (атрибут)
@*
или @a
или ../@a
или a/@b
a[@b and @c]/@d
a[b[@c="d"]/e[@f and @g]]/h[@i="j"]/@k
Отрицательный (не атрибут)
a[@b]
или a[@b and @c]
a[b[@c and @d]/@e]
a[b[@c="d"]/e[@f and @g]]/h[@i="j"]/k[5][@l="m"]
Я не могу вспомнить юридический пример, где есть /
, но нет ]
после последнего примера, но я думаю, что может быть один.
Надеемся, что эти примеры хотя бы немного прояснят, что может быть произвольное вложение [
и ]
вместе с @
s где-нибудь между ними. К счастью, я думаю, что только самый последний @
и его уровень вложенности имеют значение.
(Для справки: регулярное выражение OP не выполняется на @a
. Мое исходное регулярное выражение не выполнено на a[@b and @c]
.)
Редактировать : Оказывается, что есть больше угловых случаев, что убеждает меня в том, что не существует абсолютно правильного регулярного выражения. Например, если у вас есть узел атрибута, есть много способов его сохранить, например, //@a//
или //@a/.
в сокращенном синтаксисе. Есть также множество более креативных способов, таких как //@f//[node()]
. В общем, кажется, что если вы хотите охватить эти случаи, вы должны иметь возможность сопоставлять [
и ]
, чего не может сделать основное регулярное выражение. С другой стороны, вы можете решить, что это слишком надумано ...