我有两个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
答案 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()]