XPath基于祖先元素查找元素

时间:2010-03-25 12:59:05

标签: java xml xpath abstract-syntax-tree

我再次使用

创建的Java AST
public class Test  {
     String o = new String("hh");
     public void wrong1() {
       synchronized(o) {
             // huhu
      }
   }
}

我尝试创建一个XPath查询,该查询查找使用已定义的String变量o的synchronized块。

由于定义在上面,它是SynchronizedStatement的祖先,但我不能让它工作

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

我知道/SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=是正确的,我的问题是如何解决祖先ClassOrInterfaceBody部分。

希望明确我的意思; - )

由于

1 个答案:

答案 0 :(得分:2)

测试两个@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
]

如果原始XPath中的@Image是“String”:

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