XPATH 1.0相当于SQL中的ALL

时间:2012-10-14 21:49:57

标签: xpath

XPATH 1.0相当于在SQL中使用嵌套查询和“ALL”关键字。例如,请考虑以下代码段。

<parent> a <child gender = "male">b</child>
<child gender = "female>c</child></parent>
<parent> z <child gender = "male"> y </child></parent>

我应该如何检索所有孩子都有性别=“男性”的节点。这可以在SQL中通过编写子查询来返回子项的性别,然后使用ALL关键字将其嵌套以检查所有子项是否为男性。

Q2 另外,我如何检索所有父母只有一个(男性)孩子。还要考虑父节点可能有其他节点。计算孩子父母的姓名“孩子”的数量,并检查孩子是否是我想要解决问题的方式。这是最好的方式还是有更好的方法呢?

注意:在我的任务中,我遇到了需要类似查询的问题。我试图自己找到答案,但不能。请帮忙

3 个答案:

答案 0 :(得分:1)

全部:选择有孩子的父母,但没有非男性的孩子:

//parent[child and not child[@gender!="male"]]

选择只有一个男孩的父母 - 选择一个孩子只有一个男孩的父母:

//parent[count(child)=1 and child[@gender="male"]]

答案 1 :(得分:1)

How should i retrieve nodes where ALL children have gender = "male". 

使用

/*/parent[child
        and
          (not(child[not(@gender) or not(@gender='male')]))
         ]

这会选择

的所有parent元素
  1. 是XML文档顶级元素的子元素,

  2. 有一个child孩子,

  3. 所有child个孩子都有gender个属性,

  4. 所有child个孩子的gender属性的字符串值为“男性”

  5. 这里我们使用了非常通用且有用的double-negation law

    您的第二个问题

      

    Q2此外,我如何检索所有父母只有一个(男性)   子。

    使用

    /*/parent[child[@gender='male']
            and
              not(child[2])
             ]
    

    选择

    1. 任何parent元素,它是XML文档顶部元素的子元素,

    2. 有一个child孩子,其gender属性的字符串值为“男性”,

    3. 没有第二个child孩子。

    4. 基于XSLT的验证

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output omit-xml-declaration="yes" indent="yes"/>
       <xsl:strip-space elements="*"/>
      
       <xsl:template match="/">
        <xsl:copy-of select=
        "/*/parent[child
                 and
                  (not(child[not(@gender) or not(@gender='male')]))
                  ]"/>
        ==========
      
        <xsl:copy-of select=
        "/*/parent[child[@gender='male']
                 and
                   not(child[2])
                  ]"/>
      
       </xsl:template>
      </xsl:stylesheet>
      

      将此转换应用于以下XML文档(提供的文档,扩展为更具代表性):

      <t>
          <parent> a
              <child gender="male">b</child>
              <child gender="female">c</child>
              <child gender="female">d</child>
          </parent>
          <parent> e
              <child gender="male">f</child>
              <child gender="male">g</child>
              <child gender="female">h</child>
          </parent>
          <parent> z
              <child gender="male">x</child>
              <child gender="male">y</child>
          </parent>
          <parent> t
              <child gender="male">u</child>
          </parent>
      </t>
      

      评估两个XPath表达式,并将这些评估中的结果(选定元素)复制到输出

      <parent> z
              <child gender="male">x</child>
         <child gender="male">y</child>
      </parent>
      <parent> t
              <child gender="male">u</child>
      </parent>
        ==========
      
        <parent> t
              <child gender="male">u</child>
      </parent>
      

答案 2 :(得分:1)

  

我应该如何检索所有孩子都有性别=“男性”的节点。

一些受访者认为这意味着必须至少有一个孩子。但是你要求相当于SQL的ALL运算符,我相信在SQL中(如在数学逻辑中),如果应用于空集,则ALL返回true。 (所有独角兽都有两个角 - 告诉我一个没有角。)

所以我认为对你的问题的严格回答将删除Dimitre在他的答案中包含的“孩子和”。但是Dimitre可能已经猜到了你所要求的并不是你真正想要的东西。