Java 基于祖先元素的XPath查找元素

Java 基于祖先元素的XPath查找元素,java,xml,xpath,abstract-syntax-tree,Java,Xml,Xpath,Abstract Syntax Tree,同样,我有JavaAST,它是从 public class Test { String o = new String("hh"); public void wrong1() { synchronized(o) { // huhu } } } 我尝试创建一个XPath查询,用于查找使用已定义字符串变量o的同步块 正如上面的定义,它是SynchronizedStatement的祖先,但我无法让它工作 //Synchro

同样,我有JavaAST,它是从

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=
是正确的,我的问题是如何处理祖先类或接口体部分

希望我的意思很清楚;-)


感谢测试两个@Image是否相同

//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image ]
为了测试字符串类型,假设FieldDeclaration和FieldVariableDeclaratorId具有公共属性(名称)

如果原始XPath中的@Image为“字符串”:


谢谢你,这是可行的。但另一个问题是,基本上我想检查两个@Image是否相同,但前提是变量是字符串。所以Object o=new Object();不应匹配…我如何组合这两个条件a)检查@Image,并且找到的祖先元素也是字符串类型。我知道如何检查它是否是字符串,但不知道如何组合到搜索(它们在同一节点上工作). THANKS@martymcfly字符串类型的测试是什么,在哪个节点上?基本上是在上面的祖先中。伪类图像与
祖先进行比较:ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/VariableDeclarator/VariableDeclaratorId/@image
,并对该祖先
进行字符串比较ncestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/Type/ReferenceType/ClassOrInterfaceType[@Image='String']
因此,基本上,
字段声明
是包含字符串和名称信息的节点。但是,
ClassOrInterfaceBody
是这个和synchront.statement的共同祖先。我需要两个祖先调用完全相同的祖先。如果这是任何其他字段声明,它是一个字符串,而不仅仅是同步块中的字段声明。@martymcfly我们需要能够从FieldVariableDeclaratorId中找到一个FieldDeclaration。是否有FieldDeclaration/@Id?
//SynchronizedStatement[
    Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = 
    ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId[
        @name = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[Type/ReferenceType/ClassOrInterfaceType/@Image = 'String']/@name
    ]/@Image
]
//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image[. = 'String'] ]