首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何断言所有子节点在XPath中都有特定的属性值?

如何断言所有子节点在XPath中都有特定的属性值?
EN

Stack Overflow用户
提问于 2009-07-15 23:13:16
回答 4查看 1.9K关注 0票数 0

给定以下部分XML文档:

代码语言:javascript
复制
<section>
    <entry typeCode="DRIV">
        <act classCode="AT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>
    <entry typeCode="DRIV">
        <act classCode="ACT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>
    <entry typeCode="DRIV">
        <act classCode="ACT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>
    <entry typeCode="DRIV">
        <act classCode="ACT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>

    <section>
        <entry typeCode="DRIV">
            <act classCode="AT" moodCode="DEF">
                <statusCode code="completed"/>
            </act>
        </entry>
        <entry typeCode="DRIV">
            <act classCode="ACT" moodCode="DEF">
                <statusCode code="completed"/>
            </act>
        </entry>
    </section>
</section>

我想断言,作为外部<section>元素的后代的所有元素(内部<section>元素除外)的classCode属性都具有值"ACT"

换句话说,给定上面的示例,我不需要在第二个<section>元素中断言两个<act>子元素的值。此外,可以有一个或多个嵌套的<entry>元素(没有最大值)。

我尝试了下面的XPath表达式,

代码语言:javascript
复制
<xsl:when test="cda:section/cda:entry/cda:act//@classCode='ACT'"/>

如果任何<act>元素的属性classCode的值不是"ACT",则断言应该失败。我正在寻找关于如何更改我的XPath表达式以满足此要求的建议。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-16 00:28:44

您只需反转条件:

代码语言:javascript
复制
<xsl:when test="not(cda:section/cda:entry/cda:act//@classCode != 'ACT')"/>

如果任何@classCode不等于'ACT',则not()中的表达式将生成true。只有当没有@classCode等于'ACT'时,它才会返回false。然后我们也反转它,得到想要的效果。

票数 4
EN

Stack Overflow用户

发布于 2009-07-16 00:15:47

假设上下文节点是外部<section>的直接父节点,您可以使用以下测试完成此操作:

代码语言:javascript
复制
<xsl:when test="count(cda:section/cda:entry/cda:act) = count(cda:section/cda:entry/cda:act[@classCode = 'ACT'])">
    <foo/>
</xsl:when>

这是通过计算属于<entry><act>元素的数量来实现的,这些元素是<section>的直接后代(跳过子<section>中的任何内容)。然后,它计算classCode为"ACT“的<act>的数量,并查看这两个计数是否匹配。因为一个节点不可能匹配第二个计数而不是第一个计数,所以您知道,所有非嵌套的子代<act>都有正确的classCode

票数 1
EN

Stack Overflow用户

发布于 2009-07-16 08:58:36

如果任何<act>元素的属性classCode的值不是"ACT",则断言应该失败。

另一种可能在语义上更明显的变体:

代码语言:javascript
复制
count(cda:section/cda:entry/cda:act[@classCode != 'ACT']) = 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1134603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档