xpath让最近的祖先的属性值决定它是否在

时间:2013-02-22 09:56:20

标签: xml xpath

我正在寻找合适的xpath表达式来选择最近的祖先具有正确属性值的所有节点,而不是选择那些最近的祖先具有明确的“不选择”属性值的节点。 视觉解释:对于每个分支,遵循其到根的路径,并且第一次遇到某个属性时应确定它是否在选择中。

<xyz select="yes">
    <blabla>this one's in</blabla>
    <qwerty select="no">this one's out
        <foobar>out please!</foobar>
        <gettingoutofnames select="yes">in again!</gettingoutofnames>
    </qwerty>
</xyz>

示例可以出现在XML结构中的任何位置。

元素的名称可以是任何东西。 'select =“yes”'和'select =“no”'可以按任何顺序排列,但最深的一个是决定性的后代。

我在想这样的事情:

//*[@select="yes"]//ancestor::*[not(@select="no")]

但这并不能解决所有问题。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

用于选择值

cat //*[contains(@select,'yes')]

用于选择否定结果

cat //*[not(contains(@select,'yes'))]

希望你能找到解决问题的方法

答案 1 :(得分:0)

我认为以下内容应该有效:

//*[ancestor::*[@select][1]/@select='yes']

要将其分解:ancestor::*[@select][1]是距离最近的祖先select属性。因此,我们只选择那些具有select属性的最近祖先将此属性设置为'yes'的节点。如果您还希望在示例中包含ancestor属性(ancestor-or-selfselect="yes"),则必须将xyz替换为gettingoutofnames。< / p>