此查询返回的值小于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>
Run Code Online (Sandbox Code Playgroud)
为什么它包含在结果中?
样本数据:
<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>
Run Code Online (Sandbox Code Playgroud)
谢谢.
样本大楼有一个空缺的孩子,平方英尺2000,所以Vacancy/sqft > 1000成功.它有一个平方英尺1000(和900和500)的孩子,所以Vacancy/sqft < 1100成功.因此,xpath选择Building.
比较表达式(例如Vacancy/sqft <= 1000)隐式限定为" 存在 " - 在"存在具有值> 1000的sqft子节点的空缺子节点 " - 因为Vacancy/sqft是一组节点,而不是单个节点.此外,每个比较都有自己的资格,因此sqft in Vacancy/sqft > 1000不需要与in 中相同的sqft Vacancy/sqft < 1100.注意,这//results/Buildings是一个节点集; 谓词分别[...]应用于集合中的每个项目,这就是限定符没有问题的原因.将原始xpath翻译成英文,我们得到:
选择建筑物(在结果中),使得1 = 1并且存在空置面积> 1000并且存在空置面积<1100.
让我们采用所需查询的英语声明,使其更接近逻辑语句,得到以下其中一个:
选择建筑物(在结果中),使得存在具有平方英尺的空位,使得其大于1000并且其<1100
选择建筑物(在结果中),使得存在空位,使得平方英尺> 1000并且平方英尺<1100
前者导致jasso的解决方案,后者导致:
//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平方英尺.
用更少的话来说:
选择所有空置的建筑物,所有空位都在1000到1100平方英尺之间.
您是否还需要匹配超出标准的平方英尺建筑物,但至少有一平方英尺在1000-1100之间
<Building>Should this be selected too?
<Vacancy><sqft>1000</sqft></Vacancy>
<Vacancy><sqft>1050</sqft></Vacancy>
<Vacancy><sqft>2000</sqft></Vacancy>
</Building>
Run Code Online (Sandbox Code Playgroud)
如果是,则使用XPath表达式
/results/Building[Vacancy/sqft[. > 1000 and 1100 > . ] or not(Vacancy)]
Run Code Online (Sandbox Code Playgroud)
它还选择没有<Vacancy>元素的建筑物(根据要求).