如何在以下表达式中选择b
和a
?
//td[@class='ttr_interest']/b/a/text()
基本上/b/a
可能会或可能不会出现在树中(仅a
或仅b
或两者都存在,或者两者都不存在。一般如何指定可选元素?
我希望捕获td
中包含的文字,无论<a>
和<b>
是否附加了该文字。
按要求提供样品
<td>
<a href="#">text_to_capture</a>
</td>
<td>
<b><a href="#">text_to_capture</a></b>
</td>
<td>
text_to_capture
</td>
答案 0 :(得分:2)
使用强>:
(//td[@class='ttr_interest']
|
//td[@class='ttr_interest']/a
|
//td[@class='ttr_interest']/b/a
)
/text()
这将选择由括号中联合在一起的三个XPath表达式之一选择的任何元素的任何文本节点智能。
答案 1 :(得分:1)
你没有说你在哪个上下文(XSLT?),但这是一个Python / lxml建议:
from lxml import etree
XML = """
<root>
<td>
<a href="#">text_to_capture</a>
</td>
<td>
<b><a href="#">text_to_capture</a></b>
</td>
<td>
text_to_capture
</td>
</root>"""
doc = etree.fromstring(XML)
expr = "//td//text()"
texts = doc.xpath(expr)
print texts # includes whitespace-only nodes
for t in texts:
if t.strip():
print t.strip()
输出:
['\n ', 'text_to_capture', '\n ', '\n ', 'text_to_capture', '\n ', '\n text_to_capture\n ']
text_to_capture
text_to_capture
text_to_capture
此解决方案选择<td>
中的所有文字,而不管任何<td>
子元素的名称。
答案 2 :(得分:0)
编辑:评论改变xpath后适合问题
<bar>
xxxx
<foo>xxx</foo>
<barfoo>
<foo>xxx</foo>
</barfoo>
</bar>
使用此xpath
//bar//*/text()|//bar/text()