XML& XPath表达式

时间:2010-11-19 15:35:23

标签: xml xpath

说我有这个XML:

<root>
    <A></A>
    <B></B>
    <C>one</C>
    <C>two</C>
    <C>three</C>
    <D></D>
</root>

现在我想得到所有节点,除了C节点'two'和'three'。 现在我想选择哪个C节点可以按索引保留。

所以这是我已经拥有的xpath:

 //*[not(ancestor-or-self::C)]

但这会删除所有C节点,所以现在我必须添加一个索引到我想要保留的C节点

//*[not(ancestor-or-self::C)] exept for C[1]

如果我选择索引1:

,我怎样才能完成此操作以便输出
<root>
   <A></A>
   <B></B>
   <C>one</C>
   <D></D>
</root>

或者,如果我选择索引2:

<root>
   <A></A>
   <B></B>
   <C>two</C>
   <D></D>
</root>
希望我足够清楚:p THX

3 个答案:

答案 0 :(得分:1)

我认为这取决于你定义为“索引”的内容。如果将“index”定义为具有n-1 C兄弟的C,那么您可以这样做:

显示第一个(之后删除所有

/root/*[not(name() = 'C'  and count(preceding::C) >= 1)]

仅显示第二个

/root/*[not(name() = 'C' and (count(preceding::C) < 1 or count(preceding::C) > 1))]

(我测试过这个:http://www.xmlme.com/XpathTool.aspx只是fyi)

答案 1 :(得分:1)

为什么除外?您有之外的任何元素,然后添加其中一些元素:

//*[not(ancestor-or-self::C)]|//C[1]/descendant-or-self::*

答案 2 :(得分:0)

使用

//*[not(self::c and not(count(preceding-sibling::c) = $ind - 1))]

其中$ ind是您要选择的c元素的有用位置(从1开始)。