我有一个类似于下面结构的XML。
<root>
<randomElement>..</randomElement>
<EFFECT>..</EFFECT>
<parent2>
<randomElement>..</randomElement>
<EFFECT>..</EFFECT>
<parent>
<randomElement>..</randomElement>
<EFFECT>..</EFFECT>
<randomElement>..</randomElement>
<ITEM>..</ITEM>
</parent>
</parent2>
</root>
注意:这些地方可以有任意数量的
<randomElement>
在哪里指定。
所以,现在,我的指针位于<ITEM>
标记处。我需要返回<EFFECT>
标记内的值,但是,这里是捕捉。
如果它存在,我必须返回<EFFECT>
标记内的<parent>
标记的值。如果它不存在,我必须返回<EFFECT>
标记内<parent2>
标记的值。同样,如果它也不存在,我需要最终返回<EFFECT>
内<root>
标记的值。 <EFFECT>
内的<root>
将始终存在,<ITEM>
元素可以包含任意数量的父级。
很抱歉,如果它令人困惑。
答案 0 :(得分:0)
要转到任何<ITEM>
,这就足够了。
//ITEM
现在,<EFFECT>
是<ITEM>
的兄弟,即它在同一级别上。另一种思考兄弟姐妹的方式是他们是同一父母的孩子。
事实上,所有<EFFECT>
个元素都是<ITEM>
祖先的子元素。这意味着我们可以沿着ancestor::
轴向上移动并一步抓住所有这些祖先元素:
//ITEM/ancestor::*
这将按此顺序为我们<parent>
,<parent2>
和<root>
。
从那些我们只需要向下一步即可获取所有<EFFECT>
元素:
//ITEM/ancestor::*/EFFECT
这将为我们提供三个EFFECT
元素,这次再次按文档顺序排列(只有ancestor::
类型的轴在内部工作)。
我们对最后一个感兴趣,因为这将最接近我们开始的<ITEM>
。 last()
函数将在此处提供帮助:
(//ITEM/ancestor::*/EFFECT)[last()]
路径周围的括号是必要的,因为否则条件([last()]
)会在每个<EFFECT>
上单独测试,并且每个条件都是其父类的最后一个,给出我们三场比赛。括号使得首先构造一个包含三个<EFFECT>
元素的节点集,然后然后最后一个元素被构造,只给我们一个匹配。
如果您当前位于<ITEM>
元素,则路径的相对版本会选择该特定项目的最后一个效果:
(ancestor::*/EFFECT)[last()]