为什么XPath中的索引以1而不是0开头?


117

我和一些同事正在比较我们过去编程的语言,并在谈论我们在VBScript中的使用经验,它具有奇特的功能,例如基于1的索引而不是几乎所有其他语言都具有的基于0的索引,原因是用户语言(例如Excel VBA)而不是开发人员语言。

然后有人说:“ XPath也有基于1的索引 ”,直到我找到这篇文章,我才不敢相信。在这篇文章中,有很多理由支持基于0的方法,包括Michael Kay本人的一些理由:

  • “ ...从零开始的索引趋向于在使用一维数组访问表达式访问多维数组时简化索引公式”
  • “在处理表或下标为字符串时,从零开始的寻址通常会更加方便”
  • “ ...硬件寻址不是基于0的寻址的唯一好处...它还使计算更容易...”

但随后引用了迈克尔·凯的结论:

...基于1的逻辑是XPath和XSLT的正确选择...因为该语言是为用户而不是为程序员设计的,并且用户仍然习惯将本书的第一章称为Chapter之一...

有人可以向我解释吗? (1)XPath是如何为用户设计的?我无法想象任何不是开发人员都对XPath的语法严格性或XSLT的声明性/功能性编程方面感到困惑的人。和(2)为什么确实的XPath的创造者违背现代编程语言的规范,通过选择基于1指数?


7
在同一篇文章中,迈克尔还引用了以下词语:“我无法告诉您该决定的实际历史是什么;我只能对其进行合理化。” 即使他不知道,也可能没有令人满意的答案。
Dirk Vollmar,2010年

5
我投票结束这个问题是主观的和有争议的。基于0的索引绝不比基于1的索引好。反之亦然:基于1的索引绝不比基于0的索引好。两者都有优缺点。对于非程序员,基于1的索引更自然。它还允许将范围的上限指定为n,而不是非常不自然的,通常会导致错误n - 1。对于因“现代编程”逻辑而变态的任何人,开始使用基于1的索引将是一种享受和令人耳目一新的体验:)
Dimitre Novatchev 2010年

3
这个stackoverflow问题的答案表明,基于0的索引是首选的,其原因有很多:stackoverflow.com/questions/393462/defend-zero-based-arrays
Edward Tanguay 2010年

9
我的问题实际上是一个真实的问题,因为我教编程,并希望对有关xpath索引的问题有一个答案,以防万一。我认为最好的答案是从1开始的索引映射到position(),该位置在xpath中大量使用。
爱德华·唐格

64
我认为这是一个合法的问题,不应关闭。它要求一个历史事实,而不是一个见解的问题,而答案将是有启发性的。
本·弗林

Answers:


30

数组和其他集合索引表示内存偏移,因此从逻辑上讲它们从零开始。XML和XPATH索引表示位置和计数,因此从逻辑上讲它们从1开始(因此零表示“空”)


8

要回答这个问题,我们必须检查一些技术的历史。

RSS XML XSLT和XPath历史记录

RSS的0.9版本最初是由Netscape的几个人在1999年作为Netscape的my.netscape.com门户网站的RDF网站摘要发布的。那年晚些时候,随着v0.91更新,它被重命名为RSS(丰富站点摘要)。该项目的开发曾几经易手,但RSS版本1.0于2000年12月发布。随着v1.0更新,RSS包括对XML的支持。

在2002年的v2.0中,9月以RSS(真正的简单联合组织)的形式发布,并开始发展成为一种主要的互联网技术。在早期的历史中,人们以原始格式读取RSS提要(以及其中包含的XML数据)。博客和其他新闻来源使用RSS提要和XML来输出不断更新的信息。由于XML仅由凡人(非程序员)读取,因此XPath和XSLT也需要易于理解,以便与它们进行交互时,这些仅凡人不会被复杂性淹没。这就是XPath模仿URI样式的原因,这是最终用户已经熟悉的东西。为使用户易于阅读而做出的让步之一是使用老式的编号技术,即基于1的索引而不是基于0的索引。

尽管使RSS提要和XML对于大多数人来说都是可读的,但是开发了RSS阅读器是为了使人们阅读RSS提要提供一个更加愉悦的界面。现在,几乎可以使用某种类型的阅读器或图形界面来完全读取原始RSS和XML数据。XML在整个Web上仍然经常使用(也许是永久使用),但是它被精美的图形用户界面所掩盖,以为最终用户提供更好的体验。

*“ 凡人 ”一词是指不是程序员的人


5
我不认为这与RSS有太多关系。例如,从1999年4月开始,在该XSL规范后来分为XPath和其他规范)中,“ position()函数返回上下文节点在上下文节点列表中的位置。第一个位置为1,因此最后一个位置位置将等于last()。” 在起草到1999年4月之前,是否有任何使用RDF的“凡人”?
马特·吉布森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.