XPath中的可选元素

时间:2012-03-04 10:38:48

标签: xpath

如何在以下表达式中选择ba

//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>

3 个答案:

答案 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()