1

我需要一个 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

4 回答 4

2

使用

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

true()当且仅当不存在其属性mc的 string-value 与 string 不同的“叶子”元素时,这将评估为。type"image"

解释:正确使用“双重否定法”。

于 2012-08-23T16:01:15.223 回答
1

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

于 2012-08-23T14:38:17.930 回答
0

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

于 2012-08-23T14:40:44.957 回答
0

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

not(//mc[not(@type = ("image", "group", "list"))])
于 2012-08-23T15:20:57.993 回答