2012-04-27 79 views
0

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
排除其他的呢?

感谢。

回答

3

我怎样才能得到包含timestamp属性的节点text

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

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

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

您可以尝试使用某种for循环一个接一个循环,并通过position获取时间戳记和文本节点,或者您可以只获取具有时间戳记的所有节点,并稍后将其文本挖出这是一种优先的方式)。

The spec是一个惊人的好阅读。

0

可以匹配属性:

//video[@timestamp]/text() 

//视频=名称为视频中的节点匹配的treee

[@timestamp]是谓语,这意味着节点必须有这样的任何地方属性

text()选择当前节点

+0

和更通用的所有文本子节点?请参阅编辑。 – elp 2012-04-27 09:26:06