【问题标题】:Xpath > How can I select a node based on both its attributes and content?Xpath > 如何根据节点的属性和内容选择节点?
【发布时间】:2010-06-08 12:50:15
【问题描述】:

示例 XML:

<assignments>
<assignment id="911990211" section-id="1942268885" item-count="21" sources="foo">
    <options>
        <value name="NumRetakes">4</value>
        <value name="MultipleResultGrading">6</value>
        <value name="MaxFeedbackAttempts">-1</value>
        <value name="ItemTakesBeforeHint">1</value>
        <value name="TimeAllowed">0</value>
    </options>
</assignment>
<assignment id="1425185257" section-id="1505958877" item-count="4" sources="bar">
    <options>
        <value name="NumRetakes">0</value>
        <value name="MultipleResultGrading">6</value>
        <value name="MaxFeedbackAttempts">3</value>
        <value name="ItemTakesBeforeHint">1</value>
        <value name="TimeAllowed">0</value>
    </options>
</assignment>
<assignments>

使用 XPath,我想选择节点“名称”属性为“MaxFeedbackAttempts”且节点内容为“-1”的所有分配/分配/选项/值节点。也就是说,我要返回每个节点看起来像:

<value name="MaxFeedbackAttempts">-1</value>

我可以使用以下方法获取具有指定属性的每个 assignments/assignment/options/value 节点:

//assignment/options/value[@name="MaxFeedbackAttempts"]

我只是不确定如何优化此路径以根据节点内容限制结果。有没有办法使用 XPath 做到这一点?

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案以获得更紧凑和更有效的解决方案。 :)

标签: xml xpath


【解决方案1】:
//assignment/options/value[@name="MaxFeedbackAttempts" and text()="-1"]

【讨论】:

  • 太棒了。正是我想要的。谢谢!
【解决方案2】:

使用

/assignments/assignment/options/value[@name='MaxFeedbackAttempts' 和 . = -1]

尽量避免使用// 缩写,因为它的评估可能非常低效。

【讨论】:

  • @Andrew-Kirk:这里的做法是接受并支持有用的答案。答案旁边应该有一个类似复选标记的东西——点击这张图片就会被接受。 :)
  • 感谢您指出接受答案的过程。我的错,我应该阅读发布说明......目前,我没有投票和回答的声誉,但这里是 +1。 :-)
【解决方案3】:

您可以使用多个 [...] 约束,并且可能需要这样的 XPath 查询:

//赋值/选项/值[@name="MaxFeedbackAttempts"][text()="-1"]

【讨论】:

  • 如果您将value() 更改为text().,您的解决方案将是一个有效的答案。
  • @Mads:我知道我应该测试一下!固定...
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多