XPath - 确定树是否只有一种类型的“叶子”节点

时间:2012-08-23 14:32:26

标签: xml xslt xpath xpathnavigator

我需要一个XPath表达式来验证XML列表元素是否只有某种类型的节点。 例如:

我需要知道列表中是否只有图像。

<?xml version="1.0" encoding="UTF-8"?>

<mc type="group"> 
  <mc type="list"> 
    <mc type="group"> 
      <mc type="image"/> 
    </mc>  
    <mc type="group"> 
      <mc type="image"/> 
    </mc>  
    <mc type="group"> 
      <mc type="image"/> 
    </mc>  
    <mc type="group"> 
      <mc type="image"/> 
    </mc> 
  </mc> 
</mc>

以上XML为TRUE

<?xml version="1.0" encoding="UTF-8"?>

<mc type="group"> 
  <mc type="list"> 
    <mc type="group"> 
      <mc type="image"/> 
    </mc>  
    <mc type="group"> 
      <mc type="image"/> 
      <mc type="text"/>
    </mc>  
    <mc type="group"> 
      <mc type="image"/> 
    </mc>  
    <mc type="group"> 
      <mc type="image"/> 
    </mc> 
  </mc> 
</mc>

以上XML为FALSE

4 个答案:

答案 0 :(得分:2)

使用

not(//mc[not(mc) and @type[not(. = 'image')]])

当且仅当没有“leaf”true()元素时,其mc属性与字符串{{1}不同的字符串值才会计算为type }。

说明:正确使用“ double-negation law ”。

答案 1 :(得分:1)

如果您从文档节点开始作为上下文节点,则可以检查not(/mc/mc[@type = 'list']//mc[not(@type = 'image')]);如果您从具有not(.//mc[not(@type = 'image')])属性的mc元素开始,则可以type="list"

答案 2 :(得分:0)

你可以使用一个或多个的否定:not(one-or-more(mc[not(@type = 'image')]))或其他一些。

答案 3 :(得分:0)

或者是愚蠢/简单方法,检查所有mc元素(如果它们不是图像/组/列表):

not(//mc[not(@type = ("image", "group", "list"))])