输入是这样的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<input>
<Scopes>
<Scope>Issuance</Scope>
<Scope>TimeSeries</Scope>
<Scope>MonthlyDisclosures</Scope>
</Scopes>
<AsyncFlag>true</AsyncFlag>
</input>
两位不同的开发人员编写了XPATH来评估这个XML文档;他们的XPATH的要点是:
&#34;如果输入文档中包含<Scope>MonthlyCollateral</Scope>
或<Scope>MegaUltimateCollateral</Scope>
,并且<AsyncFlag>
= true,则执行以下XSLT块&#34;。
开发人员以这种形式写了她的XPATH:
<xsl:if test="(exists(/input/Scopes[Scope='MonthlyCollateral']) or exists(/input/Scopes[Scope='MegaUltimateCollateral' ])) and /input/AsyncFlag='true' ">
开发人员2以这种形式编写了他的XPATH:
<xsl:if test="exists(/input/Scopes[Scope='MonthlyCollateral'] or /input/Scopes[Scope='MegaUltimateCollateral' ]) and /input/AsyncFlag='true' ">
版本1使用两个单独的exists()调用和一个&#34;或&#34;,而版本二使用一个exists()调用包含或者一起使用XPATH。
在我的帖子顶部显示XML文档时,这两个测试都应该评估为false;但是,只有第一个返回false的预期结果。
在阅读了Michael的回复之后,我决定将其提炼到其本质 - &#34;为什么当xpath-1和xpath-都不存在时(xpath-1或xpath-2)评估为true 2评价为真。
根据XML文档评估时,以下内容返回 true :
exists(/input/Scopes[Scope='Issuance'])
根据XML文档计算时,以下内容返回 false :
exists(/input/Scopes[Scope='MegaUltimateCollateral'])
根据XML文档评估时,以下内容返回 true :
exists(/input/Scopes[Scope='MegaUltimateCollateral'] or /input/Scopes[Scope='Issuance'])
根据XML文档评估时,以下内容返回 true :
exists(/input/Scopes[Scope='MegaUltimateCollateral'] or /input/Scopes[Scope='MonthlyCollateral'])
前三个对我有意义 - 至少有一个XPATH确实选择了a,因此确实存在&#34;存在&#34;。然而,最后一个对我来说仍然没有意义; MegaUltimateCollateral和MonthlyCollateral都不存在于/ input / Scopes中,因此在我(或许是不合时宜的)读取&#34;或&#34;时,exists()应该评估为false,而不是true。
答案 0 :(得分:0)
我很难理解为什么版本2返回true。
因为两者:
exists(true())
和
exists(false())
返回true
。你在exists()
函数中有一个布尔表达式,并且该布尔表达式的结果总是存在&#34;存在&#34;这种或那种方式(如果有任何意义)。
重要提示:
请注意,第一个测试也是不正确的(IIUC),因为它在or
表达式周围没有括号。
而且,根据您的说明,它应该测试not(exists())
而不是exists()
。