给定以下部分XML文档:
<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表达式,
<xsl:when test="cda:section/cda:entry/cda:act//@classCode='ACT'"/>如果任何<act>元素的属性classCode的值不是"ACT",则断言应该失败。我正在寻找关于如何更改我的XPath表达式以满足此要求的建议。
发布于 2009-07-16 00:28:44
您只需反转条件:
<xsl:when test="not(cda:section/cda:entry/cda:act//@classCode != 'ACT')"/>如果任何@classCode不等于'ACT',则not()中的表达式将生成true。只有当没有@classCode等于'ACT'时,它才会返回false。然后我们也反转它,得到想要的效果。
发布于 2009-07-16 00:15:47
假设上下文节点是外部<section>的直接父节点,您可以使用以下测试完成此操作:
<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。
发布于 2009-07-16 08:58:36
如果任何
<act>元素的属性classCode的值不是"ACT",则断言应该失败。
另一种可能在语义上更明显的变体:
count(cda:section/cda:entry/cda:act[@classCode != 'ACT']) = 0https://stackoverflow.com/questions/1134603
复制相似问题