2010-03-25 109 views
1

再次我有一個從的XPath尋找元素基於祖先元素

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

創建我嘗試創建一個XPath查詢其找到synchronized塊,其中定義字符串變量o是用java AST。

由於定義是它上面是SynchronizedStatement的祖先,但我不明白它的工作

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

我知道/SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=是正確的,我的問題是如何解決的祖先ClassOrInterfaceBody部分。

希望其明確我的意思;-)

感謝

回答

2

爲了測試這兩個@Image是相同的。

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

還要測試字符串類型,假定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是 「字符串」:

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

感謝那個 - 那個工作。 但另一個問題 - 基本上我想檢查兩個@Image是相同的,但只有當變量是一個字符串。 so Object o = new Object();不應該匹配... 如何組合這兩個條件a)@Image檢查,並且找到的祖先元素也是String類型。 我知道如何檢查它是否是一個字符串,但不知道如何組合搜索(他們正在同一個節點上工作)。 謝謝 – martymcfly 2010-03-25 13:27:43

+0

@martymcfly什麼是測試字符串類型,以及在什麼節點上? – 2010-03-25 13:34:03

+0

基本上在上面的祖先。 僞像 圖像相比 '祖先:ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/VariableDeclarator/VariableDeclaratorId/@ Image' 和字符串比較對那個祖先 '祖先:: ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration /制FieldDeclaration/Type/ReferenceType/ClassOrInterfaceType [@ Image ='String']' 所以基本上'FieldDeclaration'是包含關於String和Name的信息的節點。但是'ClassOrInterfaceBody'是這個的共同祖先,並且Synchron.Statements – martymcfly 2010-03-25 13:39:01