Warum beginnen Indizes in XPath mit 1 und nicht mit 0?

117

Einige Kollegen und ich verglichen frühere Sprachen, in denen wir programmiert hatten, und sprachen über unsere Erfahrungen mit VBScript mit seinen merkwürdigen Funktionen wie 1-basierten Index anstelle von 0-basierten Indizes, wie es fast jede andere Sprache getan hat Sprache für Benutzer (z. B. Excel VBA) anstelle einer Sprache für Entwickler.

Dann sagte jemand: " XPath hat auch 1-basierte Indizes ", was ich nicht glauben konnte, bis ich diesen Artikel fand, in dem viele Gründe für den 0-basierten Ansatz angegeben sind, darunter einige von Michael Kay selbst:

  • "... eine auf Null basierende Indizierung vereinfacht die Indexformeln beim Zugriff auf ein mehrdimensionales Array mit einem eindimensionalen Arrayzugriffsausdruck."
  • "Beim Behandeln von Tabellen oder beim Abonnieren von Zeichenfolgen ist eine nullbasierte Adressierung oft viel praktischer."
  • "... Hardware-Adressierung ist nicht der einzige Vorteil der 0-basierten Adressierung ... sie erleichtert auch die Berechnung ..."

aber dann wird Michael Kay als Schluss zitiert:

... 1-basierte Logik war die richtige Wahl für XPath und XSLT ... da die Sprache für Benutzer und nicht für Programmierer entwickelt wurde und Benutzer immer noch die altmodische Angewohnheit haben, das erste Kapitel eines Buches als Kapitel zu bezeichnen Einer...

Kann mir das jemand erklären? (1) Wie ist XPath für Benutzer konzipiert? Ich kann mir niemanden vorstellen, der kein Entwickler ist, der sich mit der syntaktischen Starrheit von XPath oder den deklarativen / funktionalen Programmieraspekten von XSLT auseinandersetzt. und (2) Warum haben die Entwickler von XPath wirklich gegen die Norm moderner Programmiersprachen verstoßen, indem sie einen 1-basierten Index gewählt haben?

Edward Tanguay
quelle
7
Im selben Artikel wird Michael auch mit folgenden Worten zitiert: "Ich kann Ihnen nicht sagen, wie die tatsächliche Geschichte der Entscheidung war; ich kann sie nur nachträglich rationalisieren." Wenn selbst er es nicht weiß, gibt es wahrscheinlich keine zufriedenstellende Antwort.
Dirk Vollmar
5
Ich habe dafür gestimmt, diese Frage als subjektiv und argumentativ zu schließen. Die 0-basierte Indizierung ist in keiner Weise besser als die 1-basierte Indizierung, und das Gegenteil ist auch der Fall: Die 1-basierte Indizierung ist in keiner Weise besser als die 0-basierte Indizierung. Beide haben Vor- und Nachteile. 1-basierte Indizierung ist für Nicht-Programmierer natürlicher. Es ermöglicht auch die Angabe der oberen Grenze eines Bereichs als nnicht sehr unnatürlich und führt häufig zu Fehlern n - 1. Für alle, die aufgrund der "modernen Programmier"
-Logik pervers sind,
3
Die Antworten auf diese Stackoverflow-Frage zeigen, dass 0-basierte Indizes aus vielen Gründen bevorzugt werden: stackoverflow.com/questions/393462/defend-zero-based-arrays
Edward Tanguay
9
Meine Frage ist eigentlich eine echte Frage, da ich Programmieren unterrichte und eine Antwort auf diese Frage zu xpath-Indizes haben möchte, falls sie auftaucht. Ich denke, die beste Antwort ist, dass ein 1-basierter Index position () zugeordnet ist, der in xpath häufig verwendet wird.
Edward Tanguay
64
Ich denke, das ist eine legitime Frage und hätte nicht geschlossen werden dürfen. Es wird nach einer historischen Tatsache gefragt, die keine Ansichtssache ist, und die Antwort wäre aufschlussreich.
Ben Flynn

Antworten:

30

Array- und andere Sammlungsindizes stellen Speicherversätze dar, sodass sie logischerweise bei Null beginnen. XML- und XPATH-Indizes stellen Positionen und Zählungen dar, daher beginnen sie logischerweise bei Eins (und Null steht daher für "leer").

mike mckechnie
quelle
8

Um diese Frage zu beantworten, müssen wir die Geschichte einiger Technologien untersuchen.

RSS XML XSLT- und XPath-Verlauf

Die Version 0.9 von RSS wurde ursprünglich 1999 von einigen Mitarbeitern von Netscape für das my.netscape.com-Portal von Netscape als RDF Site Summary veröffentlicht. Später in diesem Jahr wurde es mit dem v0.91-Update in RSS (Rich Site Summary) umbenannt. Die Entwicklung des Projekts wechselte mehrmals den Besitzer, aber RSS Version 1.0 wurde im Dezember 2000 veröffentlicht. Mit dem Update v1.0 enthielt RSS Unterstützung für XML.

Im Jahr 2002 wurde v2.0 im September als RSS (Really Simple Syndication) veröffentlicht und entwickelte sich zu einer wichtigen Internet-Technologie. In seiner frühen Geschichte wurden RSS-Feeds (und die darin enthaltenen XML-Daten) von Menschen im Rohformat gelesen. Blogs und andere Nachrichtenquellen verwendeten RSS-Feeds und XML, um kontinuierlich aktualisierte Informationen auszugeben. Da XML nur von Sterblichen (Nicht-Programmierern) gelesen wurde, mussten XPath und XSLT auch leicht verständlich sein, damit diese bloßen Sterblichen bei der Interaktion nicht von Komplexität überwältigt werden. Aus diesem Grund ahmt XPath den Stil von URIs nach, mit dem Endbenutzer bereits vertraut waren. Eine der Zugeständnisse, die zum Zweck der Lesbarkeit für Benutzer gemacht wurden, war die Verwendung altmodischer Nummerierungstechniken, dh 1-basierte Indizes anstelle von 0-basierten Indizes.

Obwohl RSS-Feeds und XML für die meisten Menschen lesbar gemacht wurden, wurden RSS-Reader entwickelt, um Menschen eine angenehmere Oberfläche zum Lesen von RSS-Feeds zu bieten. Jetzt werden RSS- und XML-Rohdaten fast ausschließlich mit einem Lesegerät oder einer grafischen Oberfläche gelesen. XML wird im gesamten Web immer noch häufig (möglicherweise permanent) verwendet, wird jedoch durch ausgefallene grafische Benutzeroberflächen maskiert, um Endbenutzern eine bessere Benutzererfahrung zu bieten.

* Der Begriff " bloße Sterbliche " bezieht sich auf Menschen, die keine Programmierer sind

Andrew
quelle
5
Ich bin nicht davon überzeugt, dass es so viel mit RSS zu tun hat. In dieser XSL-Spezifikation (die später in XPath und andere unterteilt wurde ) vom April 1999 gibt beispielsweise die Funktion position () die Position des Kontextknotens in der Liste der Kontextknoten zurück. Die erste Position ist 1 und damit die letzte Position ist gleich last (). " Gab es im April 1999, als das ausgearbeitet wurde, "bloße Sterbliche", die RDF verwendeten?
Matt Gibson