看似XSLT 2.0对exists()的评估存在差异

时间:2016-08-07 22:37:42

标签: xslt xpath

输入是这样的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;。然而,最后一个对我来说仍然没有意义; MegaUltimateCollat​​eral和MonthlyCollat​​eral都不存在于/ input / Scopes中,因此在我(或许是不合时宜的)读取&#34;或&#34;时,exists()应该评估为false,而不是true。

1 个答案:

答案 0 :(得分:0)

  

我很难理解为什么版本2返回true。

因为两者:

exists(true())

exists(false())

返回true。你在exists()函数中有一个布尔表达式,并且该布尔表达式的结果总是存在&#34;存在&#34;这种或那种方式(如果有任何意义)。

重要提示:

请注意,第一个测试也是不正确的(IIUC),因为它在or表达式周围没有括号。

而且,根据您的说明,它应该测试not(exists())而不是exists()