2014-03-29 73 views
1

我正在處理的元素有時包含自己的文本,有時包含文本的跨度。我在我的程序生成的XPath得到我需要根據title屬性的元素,所以我使用的模板是這樣的:如果孩子存在,則XPath選擇子項,否則選擇父項

//div[@class='grid-canvas']//*[@title='Row %d column %s'] 

這完全適用於擁有自己的文本元素。但是,如果他們保持文本孩子跨度裏面,然後我不得不改變我的XPath模板:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/span 

我真的只是想用一個模板,我的XPath。因爲我不是希望父,如果沒有孩子,或者孩子元素(這是一個跨度)如果存在的話,我想是這樣.[not(node())] | span應該工作,所以我嘗試這樣的:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/.[not(node())] | span 

但沒」工作。我無法弄清楚我錯過了什麼。我究竟做錯了什麼?

回答

1

您的第三個查詢開始在當前上下文中再次搜索 - 如果您沒有在其他地方設置它,它將掃描<span/>根元素。

的XPath 1.0不允許交替「中間」或在路徑的終點,只能作爲前綴,那麼你將不得不重複整個路徑:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/span | 
//div[@class='grid-canvas']//*[@title='Row %d column %s'][not(span)] 

這將選擇所有「子」跨度和不包含跨度元素的父元素。

的XPath 2.0,你可以,如果只有一個(或無)要做到這一點span元素存在:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/(span, .)[1] 

或任意數字:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/(span, .[not(span)])