【问题标题】:Seeming discrepancy in XSLT 2.0's evaluation of exists()XSLT 2.0 对 exists() 的评估似乎存在差异
【发布时间】:2016-08-08 07:42:34
【问题描述】:

输入是这样的 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 的要点是:

“如果&lt;Scope&gt;MonthlyCollateral&lt;/Scope&gt;或&lt;Scope&gt;MegaUltimateCollateral&lt;/Scope&gt;在输入文档中,并且&lt;AsyncFlag&gt; = true,则执行以下XSLT块”。

开发人员以这种形式编写了她的 XPATH:

<xsl:if test="(exists(/input/Scopes[Scope='MonthlyCollateral']) or exists(/input/Scopes[Scope='MegaUltimateCollateral' ])) and /input/AsyncFlag='true' ">

开发者二以这种形式编写了他的 XPATH:

<xsl:if test="exists(/input/Scopes[Scope='MonthlyCollateral'] or /input/Scopes[Scope='MegaUltimateCollateral' ]) and /input/AsyncFlag='true' ">

版本一使用两个单独的 exists() 调用和一个“或”组合,而版本二使用一个包含对 XPATH 进行或运算的 exists() 调用。

在我的帖子顶部显示的 XML 文档中,这两个测试都应该评估为假;但是,只有第一个返回预期结果为 false。

在阅读了 Michael 的回复后,我决定将其提炼为本质——“为什么存在(xpath-1 或 xpath-2)在 xpath-1 和 xpath-2 均未评估为 true 时评估为 true。

当针对 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 ,因此它确实“存在”。然而,最后一个对我来说仍然没有意义。 /input/Scopes 中既不存在 MegaUltimateCollat​​eral 也不存在 MonthlyCollat​​eral,因此在我(可能是不合时宜的)阅读“或”时,exists() 应该评估为 false,而不是 true。

【问题讨论】:

  • "看了 Michael 的回复,我决定提炼它的本质.." 本质还是和以前一样:exists() 函数只有一个争论。当该参数是一个表达式时 - 就像在您的示例中一样 - 然后首先评估该参数,然后 exists() 函数对该评估的结果进行操作。在这种情况下,评估结果将是true 或false。 exists() 函数仅在其参数为空序列时返回false。 true 和 false 都不是空序列。
  • P.S.也许您将exists(a or b) 与exists(a | b) 混淆了。前者将始终为true,而当a 和b 都不存在时(即a 和b 的并集为空时,后者将返回false序列)。
  • 您的问题没有得到解答吗?
  • 是的,Michael.hor257K 为我回答了我的问题,我投了赞成票。
  • 如果您的问题得到解答,请通过accepting the answer关闭它。 -- “我投了赞成票。”不,你没有。

标签: xslt xpath


【解决方案1】:

我很难理解为什么第二版返回 true。

因为两者:

exists(true())

和:

exists(false())

返回true。 exists() 函数中有一个布尔表达式,该布尔表达式的结果将始终以一种或另一种方式“存在”(如果有任何意义的话)。


重要提示:

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

而且,按照您的描述,它应该测试not(exists()) 而不是exists()。

【讨论】:

  • 谢谢迈克尔。原始代码实际上确实在两个exists() 周围有括号,但我未能从XSLT 逐字复制它。另外,当我应该说“非此即彼”时,我错误地将期望的评估描述为“非/非”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多