【问题标题】:XPath expression to check for attribute values across multiple child nodes用于检查多个子节点的属性值的 XPath 表达式
【发布时间】:2012-03-24 09:30:51
【问题描述】:

鉴于下面的 XML,我正在寻找一个 XPath 查询来回答以下问题:

上述 XML 描述的语言列表是否包含所有这些语言:“英语”、“法语”和“挪威语”?

换句话说,有没有办法找出“实体”节点是否包含给定的一组语言? “English”、“French”和“Norwegian”的答案是 TRUE,但“Arabic”、“English”、“French”和“Norwegian”的答案是 FALSE。

<Document>
  <Entities>
    <Entity Name="Afrikaans" Id="2000" Type="Language"/>
    <Entity Name="Dansk" Id="2002" Type="Language"/>
    <Entity Name="Deutsch" Id="2003" Type="Language"/>
    <Entity Name="English" Id="2005" Type="Language"/>
    <Entity Name="Español" Id="2006" Type="Language"/>
    <Entity Name="French" Id="2007" Type="Language"/>
    <Entity Name="Indonesian" Id="2010" Type="Language"/>
    <Entity Name="Italiano" Id="2012" Type="Language"/>
    <Entity Name="Norwegian" Id="2018" Type="Language"/>
  </Entities>
</Document>

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    如果您使用的是 XPath 2.0,exists() 函数将返回 truefalse...

    exists(/*/Entities[*/@Name='English' and */@Name='French' and */@Name='Norwegian'])
    

    【讨论】:

    • 这为我完成了工作。谢谢!
    【解决方案2】:

    这个 XPath

    /Document/Entities/Entity[@Name='Norwegian'] and /Document/Entities/Entity[@Name='French'] and /Document/Entities/Entity[@Name='English']
    

    如果所有三种语言都存在则为true,否则为false

    【讨论】:

      【解决方案3】:

      在 XPath 1.0 中使用

        /*/*/Entity/@Name = 'English'
      and
        /*/*/Entity/@Name = 'French'
      and
        /*/*/Entity/@Name = 'Norwegian'
      

      在 XPath 2.0 中使用

       every $lang in ('English', 'French', 'Norwegian')
         satisfies
             $lang = /*/*/Entity/@Name
      

      【讨论】:

      • DevNull、Mimo、Dimitre:感谢大家的回答。我只是想让你知道我仍在尝试你的建议。作为 XPath/XQuery 的新手,我花费的时间比平时要长一些。我对 XPath 2.0 很感兴趣,并且很可能最终会使用它而不是 XPath 1.0,因为它附带了丰富的语法糖。我已经下载了 Saxon,但到目前为止还没有在 Saxon API 中找到等效的 XmlDocument.SelectNodes()。一旦我的原型工作,我会回来并标记你的一个帖子作为答案。再次感谢!
      猜你喜欢
      • 2016-01-04
      • 2017-02-19
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多