我正在寻找合适的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")]
但这并不能解决所有问题。任何帮助表示赞赏!
答案 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-self
和select="yes"
),则必须将xyz
替换为gettingoutofnames
。< / p>