XPath найти элемент, основанный на элементе предка - PullRequest
1 голос
/ 25 марта 2010

снова у меня есть Java AST, который создан из

public class Test  {
     String o = new String("hh");
     public void wrong1() {
       synchronized(o) {
             // huhu
      }
   }
}

Я пытаюсь создать запрос XPath, который находит синхронизированный блок, в котором используется определенная строковая переменная o.

Поскольку вышеприведенное определение является предком SynchronizedStatement, но я не могу заставить его работать

//SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=ancestor::ClassOrInterfaceBody[ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image]]]

Я знаю, что /SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image= правильно, моя проблема в том, как обратиться к предку ClassOrInterfaceBody.

Надеюсь, понятно, что я имею в виду; -)

Спасибо

1 Ответ

2 голосов
/ 25 марта 2010

Чтобы проверить, что два @Image одинаковы.

//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image ]

Чтобы также проверить тип String, предполагая, что FieldDeclaration и FieldVariableDeclaratorId имеют общий атрибут (имя).

//SynchronizedStatement[
    Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = 
    ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId[
        @name = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[Type/ReferenceType/ClassOrInterfaceType/@Image = 'String']/@name
    ]/@Image
]

Если @Image из оригинального XPath равно «String»:

//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image[. = 'String'] ]
...