仅在包含属性时获取节点文本?

时间:2012-04-27 09:18:48

标签: xpath

XPath问题。

我有这些节点:

[...]
<videos>
  <video timestamp="201204271112">myVideo.avi</video>
  <video>myVideo.avi</video>
  <video timestamp="201204271113">myVideo.avi</video>
  <video>myVideo.avi</video>
  <video>myVideo.avi</video>
</videos>
<photos>
  <photo timestamp="201204271112">myphoto.avi</video>
  <photo>myphoto.avi</video>
  <photo timestamp="201204271113">aphoto.avi</video>
  <photo>myphoto.avi</video>
  <photo>myphoto.avi</video>
</photos>    
[...]

如何只获取包含text属性的节点timestamp

我试过

//@timestamp

它仅返回所有时间戳属性。文字?

如何进行包含所有两个条件的查询? AND条件。

这样的事情:

//@text and //@timestamps

只得到 201204271112 - myVideo.avi
201204271113 - myVideo.avi
201204271113 - aphoto.avi
排除其他人?

感谢。

2 个答案:

答案 0 :(得分:3)

  

如何只获取包含text属性的节点timestamp

你的意思是//*[@timestamp]/text()吗?这将选择父项具有timestamp属性的所有文本节点。

条件也在XPath中(即//video[@timestamp and text()]选择同时具有video和一些文本节点的所有timestamp个节点。

您可能意味着与符号|一起使用的节点集联合。要同时获取时间戳和文本节点,您需要将两个联合在一起的查询://@timestamp | //*[@timestamp]/text()获取所有时间戳及其所有文本节点。但是,我认为你不能很好地对齐它(首先会有所有时间戳,然后是所有文本节点)。

您可以尝试使用某种for循环逐个迭代,并通过position获取时间戳和文本节点,或者您可以获取具有时间戳和挖掘的所有节点之后他们的文本(这是一种优先的方式)。

The spec对此非常好读。

答案 1 :(得分:0)

您可以匹配属性:

//video[@timestamp]/text()

// video =匹配树中任意位置名称视频的节点

[@timestamp]是一个谓词,意味着节点必须具有此属性

text()选择当前节点的所有文本节点子节点