代码之家  ›  专栏  ›  技术社区  ›  live-love

使用大于和小于时返回错误值的xpath查询?

  •  4
  • live-love  · 技术社区  · 14 年前

    此查询返回的值小于1000。它应该只返回1000到1100之间的值。为什么?

    //results/Building[ 1 = 1 and (( Vacancy/sqft > 1000 ) and ( Vacancy/sqft < 1100 ) ) ]

    查询将返回以下建筑,其空置面积小于1000平方英尺,大于1100平方英尺:

    <Building>
      <Vacancy><sqft>900</sqft></Vacancy>
      <Vacancy><sqft>1000</sqft></Vacancy>
      <Vacancy><sqft>2000</sqft></Vacancy>
      <Vacancy><sqft>500</sqft></Vacancy>
    </Building>
    

    样本数据:

    <results>
      <Building><!--Shouldn't be selected.--></Building>
    
      <Building><!--Should be selected-->
        <Vacancy><sqft>1050</sqft></Vacancy>
      </Building>
    
      <Building><!--Should be selected-->
        <Vacancy><sqft>1025</sqft></Vacancy>
        <Vacancy><sqft>1075</sqft></Vacancy>
      </Building>
    
      <Building><!--Shouldn't be selected-->
        <Vacancy><sqft>10</sqft></Vacancy>
        <Vacancy><sqft>50</sqft></Vacancy>
      </Building>
    
      <Building><!--Should be selected.-->
        <Vacancy><sqft>1050</sqft></Vacancy>
        <Vacancy><sqft>2000</sqft></Vacancy>
      </Building>
    
      <Building><!--Should be selected.-->
        <Vacancy><sqft>900</sqft></Vacancy>
        <Vacancy><sqft>1040</sqft></Vacancy>
      </Building>
    
      <Building><!--Shouldn't be selected-->
        <Vacancy><sqft>10500</sqft></Vacancy>
      </Building>
    
      <Building><!--Shouldn't be selected-->
        <Vacancy><sqft>900</sqft></Vacancy>
        <Vacancy><sqft>1000</sqft></Vacancy>
        <Vacancy><sqft>2000</sqft></Vacancy>
        <Vacancy><sqft>500</sqft></Vacancy>
      </Building>
    
    </results>
    

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  7
  •   jasso    14 年前

    你是否也需要匹配一些超出你标准的建筑,但至少有一平方英尺在1000-1100之间,像这样

      <Building>Should this be selected too?
        <Vacancy><sqft>1000</sqft></Vacancy>
        <Vacancy><sqft>1050</sqft></Vacancy>
        <Vacancy><sqft>2000</sqft></Vacancy>
      </Building>
    

    如果是,则使用XPath表达式

    /results/Building[Vacancy/sqft[. > 1000 and 1100 > . ] or not(Vacancy)]
    

    它还选择了没有 <Vacancy> 元素(按要求)。

        2
  •  8
  •   outis    14 年前

    样板楼有一个2000平方英尺的空房子项目,所以 Vacancy/sqft > 1000 成功。它有一个1000平方英尺(900和500平方英尺)的孩子,所以 Vacancy/sqft < 1100 成功。因此xpath选择了建筑物。

    Vacancy/sqft <= 1000 )隐式限定为“ there exists “如中所示”存在一个空置子项,该子项的平方英尺值大于1000,因为 Vacancy/sqft 是一个 set of nodes 空置/平方英尺>1000 不需要与中相同的平方英尺 空置/平方英尺<1100 //results/Buildings 是一个节点集;谓词 [...] 分别应用于集合中的每个项,这就是限定符不存在问题的原因。将原始xpath翻译成英语,我们得到:

    选择建筑(在结果中),使1=1且存在空置平方英尺>1000和空置平方英尺<1100。

    让我们使用所需查询的英文语句,使其更接近逻辑语句,得到以下结果之一:

    选择建筑(在结果中),使其存在一个占地面积为1000平方米和1100平方米的空房

    前者导致贾索的解决方案,后者导致:

    //results/Building[ Vacancy[1000 < sqft and sqft < 1100] ]

    原液

    (注:这回答了最初的问题,当时还不清楚OP想要什么。这项技术可能对其他有类似问题但需求不同的人很有用,所以我就不提了。)

    尝试条件的逻辑双反:

    //results/Building[ Vacancy and not (Vacancy/sqft <= 1000 or Vacancy/sqft >= 1100) ]

    这个谓词包括一个空置子项的测试,用于过滤掉那些在其他情况下微不足道的情况,即没有空置的建筑物。此解决方案的英文等价物为:

    简而言之:

    选择没有空房的所有建筑,空房面积为<=1000平方英尺或>=1100平方英尺。

    选择空置面积在1000到1100平方英尺之间的所有建筑物。

        3
  •  3
  •   user357812 user357812    14 年前
    //results
      /Building[1 = 1 and 
                (( Vacancy/sqft > 1000 ) and (Vacancy/sqft < 1100 ))]
    

    此查询返回的值小于 超过1000。它应该只会回来 值介于1000和1100之间。为什么 那个?

    http://www.w3.org/TR/xpath/#booleans

    如果要比较的对象是 那么如果 节点集,以便 在上执行比较 转换字符串值的结果 数字函数为真。

    节点集比较是 存在性比较 Vacancy/sqft > 1000 指: 至少有一个 Vacancy/sqft 大于1000?

    如果你想选择 Building 元素具有 空置/平方英尺

    /results/Building[Vacancy/sqft and not(Vacancy/sqft[1000 >= . or . >= 1100])]
    
        4
  •  1
  •   Abe Miessler    14 年前

    尝试将xpath更改为:

    //results/Building[number(Vacancy/sqft) > 1000  and  number(Vacancy/sqft) < 1100 ]
    

    我想它是在治疗你的 Vacancy/sqft

    我删除了你的1=1和额外的paren,因为我看不到它们的必要性。重点是尝试 number 功能。

    这个有点奇怪,但它抓住了你想要的,还有一个你不确定你是否想要( Should this be selected? ):

    //results/Building[count(Vacancy[sqft > 1000  and  sqft < 1100 ]) = count(Vacancy)]
    

    如果你想排除这个:

    //results/Building[(count(Vacancy[sqft > 1000  and  sqft < 1100 ]) = count(Vacancy)) and count(Vacancy) > 0]
    

    this site 给我的xpaths发短信,如果它们是如何做到的和objective-c让我知道的有一些根本的区别。。。

        5
  •  1
  •   Dimitre Novatchev    14 年前

    下面是两个XPath表达式:

    一。下面选择您相信的所有节点 被选中 :

    /*/*[Vacancy and not(Vacancy[. < 1000 or . > 1100])]
    
    1. 选择您确定不应选择的任何节点 :

    /*/*[not(Vacancy) or Vacancy[. > 1000 and not(. > 1100)]]

    :

    <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=
      "/*/*[Vacancy and not(Vacancy[. &lt; 1000 or . > 1100])]
      "/>
    
    ===============================
      <xsl:copy-of select=
      "/*/*[not(Vacancy) or Vacancy[. > 1000 and not(. > 1100)]]
      "/>
    
     </xsl:template>
    </xsl:stylesheet>
    

    :

    <results>
      <Building><!--Should this be selected?--></Building>
    
      <Building><!--Should be selected-->
        <Vacancy><sqft>1050</sqft></Vacancy>
      </Building>
    
      <Building><!--Should be selected-->
        <Vacancy><sqft>1025</sqft></Vacancy>
        <Vacancy><sqft>1075</sqft></Vacancy>
      </Building>
    
      <Building><!--Shouldn't be selected-->
        <Vacancy><sqft>10</sqft></Vacancy>
        <Vacancy><sqft>50</sqft></Vacancy>
      </Building>
    
      <Building><!--Should this be selected?-->
        <Vacancy><sqft>1050</sqft></Vacancy>
        <Vacancy><sqft>2000</sqft></Vacancy>
      </Building>
    
      <Building><!--Should this be selected?-->
        <Vacancy><sqft>900</sqft></Vacancy>
        <Vacancy><sqft>1040</sqft></Vacancy>
      </Building>
    
      <Building><!--Shouldn't be selected-->
        <Vacancy><sqft>10500</sqft></Vacancy>
      </Building>
    
      <Building><!--Shouldn't be selected-->
        <Vacancy><sqft>900</sqft></Vacancy>
        <Vacancy><sqft>1000</sqft></Vacancy>
        <Vacancy><sqft>2000</sqft></Vacancy>
        <Vacancy><sqft>500</sqft></Vacancy>
      </Building>
    
    </results>
    

    得到想要的正确结果

    <Building><!--Should be selected-->
       <Vacancy>
          <sqft>1050</sqft>
       </Vacancy>
    </Building>
    <Building><!--Should be selected-->
       <Vacancy>
          <sqft>1025</sqft>
       </Vacancy>
       <Vacancy>
          <sqft>1075</sqft>
       </Vacancy>
    </Building>
    
    ===============================
      <Building><!--Should this be selected?--></Building>
    <Building><!--Should be selected-->
       <Vacancy>
          <sqft>1050</sqft>
       </Vacancy>
    </Building>
    <Building><!--Should be selected-->
       <Vacancy>
          <sqft>1025</sqft>
       </Vacancy>
       <Vacancy>
          <sqft>1075</sqft>
       </Vacancy>
    </Building>
    <Building><!--Should this be selected?-->
       <Vacancy>
          <sqft>1050</sqft>
       </Vacancy>
       <Vacancy>
          <sqft>2000</sqft>
       </Vacancy>
    </Building>
    <Building><!--Should this be selected?-->
       <Vacancy>
          <sqft>900</sqft>
       </Vacancy>
       <Vacancy>
          <sqft>1040</sqft>
       </Vacancy>
    </Building>