如何从两个创建一个RxPath

时间:2011-02-05 18:04:26

标签: xpath

我有两个RxPath,我需要在一个表达式中编写:

/td[2]/a[1]/tag[1]

/td[2]/a[1]

所以基本上我需要选择带有'tag'元素的路径(如果存在),如果不是选择'a'元素。 类似的东西:

if exist /td[2]/a[1]/tag[1] select /td[2]/a[1]/tag[1]
else select /td[2]/a[1]

这些元素需要具有innertext属性,其中包含一些值,所以我尝试了:

/td[2]/descendant::node()[@innertext!='']

但它不起作用......

这些元素也位于层次结构的底部,所以如果有任何方法只选择最低级别的第一个元素。

我设法在我的Xpath表达式末尾用正则表达式来解决这个问题。

/dom/body/div[@id='isc_0']/div/div[@id='isc_B']/div[@id='isc_C']/div[@id='isc_10']/div/div/iframe/body/table/tbody/tr/td[1]/a[@innertext='any uri item']/../../td[2]/*[@innertext~'[^ ]+']

对于对问题的误解感到抱歉...

此致

Vajda Vladimir

2 个答案:

答案 0 :(得分:0)

  

所以基本上我需要选择路径   如果存在,则使用'tag'元素,否则   而不是选择'a'元素。某物   像:

     

如果存在

  /td[2]/a[1]/tag[1] 
     

选择

 /td[2]/a[1]/tag[1] 
     

否则选择

  /td[2]/a[1] 

我非常怀疑文档的顶部元素是td不要使用/td - 这意味着您要选择顶部元素文档和此顶部元素必须是td

此外,/td[2]从不选择任何内容,因为(格式良好的)XML文档只有一个顶级元素。

使用

  someParentElement/td[2]/a[1]/tag[1] 
| 
  someParentElement/td[2]/a[1][not(someParentElement/td[2]/a[1]/tag[1])]

  

这些元素需要有内文   属性中有一些值

使用

  someParentElement/td[2][.//@innertext[normalize-space()]]/a[1]/tag[1] 
| 
  someParentElement/td[2]
              [.//@innertext[normalize-space()]]/a[1]
                  [not(someParentElement/td[2]
                       [.//@innertext[normalize-space()]]/a[1]/tag[1])]

  

这些元素也位于底部   层次结构,所以如果有任何方法   只需选择最低的第一个元素   水平。

目前尚不清楚。请澄清一下。

可以使用以下XPath表达式选择所有“leaf”元素

//*[not(*)]

所选元素没有任何子元素,但可能有其他子元素(如文本节点,PI,注释)和属性。

答案 1 :(得分:0)

除了来自@Dimitre的所有好建议之外,我想补充一点,父母将始终(以文档顺序)而不是孩子,所以你可以使用这个XPath表达式:

(/real-path-from-root/td[2]/a[1] 
 | 
 /real-path-from-root/td[2]/a[1]/tag[1])[last()]

你可以在XPath 1.0中没有|联合集操作符的情况下执行此操作,但最终会非常难以理解......当然,在XPath 2.0中你可以这样做:

(/real-path-from-root/td[2]/a[1]/(.|tag[1]))[last()]