【问题标题】:XPath - determine if a tree has only one type of a "leaf" nodeXPath - 确定一棵树是否只有一种类型的“叶”节点
【发布时间】:2012-08-23 14:32:25
【问题描述】:

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

<?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

【问题讨论】:

    标签: xml xslt xpath xpathnavigator


    【解决方案1】:

    使用

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

    当且仅当不存在“叶”mc 元素且其type 属性的字符串值与字符串"image" 不同时,计算结果为true()

    解释:正确使用“double-negation law”。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 应该不是(/mc/mc[@type = 'list']//mc[not(@type = 'image')])?
      • 是的,你是对的,它应该是image而不是list在第一个路径的第二个谓词中,分别在第二个表达式的谓词中。我会编辑。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-07
          • 1970-01-01
          • 1970-01-01
          • 2022-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          相关资源
          最近更新 更多