【问题标题】:Need an XPath that will check an attribute value of any child, grandchild, or great grandchild, etc需要一个 XPath 来检查任何孩子、孙子或曾孙等的属性值
【发布时间】:2010-09-14 23:12:46
【问题描述】:

所以给定这个 XML...

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <tree dah="false">
        <tree dah="false">
            <tree dah="false"/>
            <tree dah="false"/>
        </tree>
        <tree dah="false">
            <tree dah="true"/>
            <tree dah="false"/>
        </tree>
    </tree>
</root>

...我需要一个评估结果为 true 的 XPath,因为至少有一棵树/@dah='true'。

但如果 XML 看起来像这样,那将评估为 false...

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <tree dah="false">
        <tree dah="false">
            <tree dah="false"/>
            <tree dah="false"/>
        </tree>
        <tree dah="false">
            <tree dah="false"/>
            <tree dah="false"/>
        </tree>
    </tree>
</root>

此外,树节点可以是任意深度。我的示例中包含三个级别,但它可以更深入。

【问题讨论】:

  • 好问题 (+1)。请参阅我对两个 XPath 表达式的回答,它们返回的布尔值与您的问题中指定的完全相同。

标签: xml xslt xpath


【解决方案1】:

使用

boolean(/root//tree[@dah='true'])

boolean((/root//tree[@dah='true'])[1])

这两个表达式是等价的,但第二个表达式对于哑(非优化)XPath 引擎会更有效。

结果是 true() 如果存在 tree XML 文档中的元素 dah 属性值 'true' -- 否则结果为false()

【讨论】:

  • 为什么要使用“boolean()”函数?
  • 另外,是 [1] 告诉它在第一次出现时停止吗?
  • @dacracot [为什么使用 boolean() fn.] 因为你想要 true/false 返回,这正是 boolean() 函数所做的:w3.org/TR/1999/REC-xpath-19991116/#function-boolean
  • @dacracot [另外,[1] 是否告诉它在第一次出现时停止?] 是的,大多数 XPath 引擎至少具有这种智能,而不是进一步评估表达式。
  • /root//tree[@dah='true'] 对我不起作用。 /root//tree[@dah=true()] 成功了
【解决方案2】:
/root//tree[@dah='true']

【讨论】:

  • 我不想要该节点,但您的解决方案是 /root//tree/@dah='true'。谢谢。
  • //tree/@dah="true" 或 /root//tree/@dah="true" 应该让您知道是真是假。
  • @dacracot,MooGoo 的回答 按照您的要求评估为真/假。如果/root//tree[@dah = 'true'] 选择一个空节点集,则在布尔上下文中计算为假。非空节点集在布尔上下文中计算为真。
  • /root//tree[@dah='true'] 对我不起作用。 /root//tree[@dah=true()] 成功了
猜你喜欢
  • 2013-08-19
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多