2016-09-02 14 views
5

Podczas badania szczegółów dotyczących odpowiedzi na pytanie XPath tutaj w Stack Overflow, natknąłem się na różnicę między XPath 1.0 i 2.0. Nie mogę znaleźć żadnego uzasadnienia.Dlaczego definicja kropki (.) Zmieniła się między XPath 1.0 a 2.0?

Próbowałem zrozumieć, co naprawdę znaczy ..

Jakie były przesłanki zmiany? Czy jest różnica między . a self::node() w XPath 2.0?

Z samej specyfikacji zamiar zmiany nie jest dla mnie jasny. Próbowałem wpisywać słowa kluczowe, takie jak kropka lub kropka, wyrażenie pierwotne i uzasadnienie.

Odpowiedz

4

XPath 1.0 miał cztery typy danych: string, number, boolean i node-set. Nie było sposobu na przetwarzanie zbiorów wartości innych niż węzły. Oznaczało to na przykład, że nie było sposobu na sumowanie uzyskanych wartości (jeśli elementy miały atrybuty postaci price='$23.95', nie było możliwości zsumowania liczb uzyskanych przez usunięcie znaku $, ponieważ wynik takiego rozbiórki byłby zbiór liczb i nie było takiego rodzaju danych).

Tak więc XPath 2.0 wprowadził bardziej ogólne sekwencje, co oznaczało, że urządzenia do manipulacji sekwencjami musiały zostać uogólnione; na przykład, jeśli $ X jest ciągiem liczb, wówczas $X[. > 0] filtruje sekwencję tak, aby zawierała tylko liczby dodatnie. Ale to działa tylko wtedy, gdy "." może odnosić się do numeru, a także do węzła.

3

W skrócie: self::node() odfiltrowuje przedmioty atomowe, natomiast . nie. Atomowe elementy (liczby, ciągi i wiele innych typów schematów XML) nie są węzłami (w przeciwieństwie do elementów, atrybutów, komentarzy itp.).

Weź pod uwagę przykład ze specyfikacji: (1 to 100)[. mod 5 eq 0]. Jeśli . zostanie zastąpione przez self::node(), wyrażenie nie jest poprawne XPath, ponieważwymaga, aby oba argumenty były numeryczne i atomizacja w tym przypadku nie pomoże.

Dla tych, którzy skanują specyfikację: XPath 2.0 definiuje konstrukcję zgodną z typem item(), ale nie ma nic wspólnego z node tests, ponieważ atom nie jest węzłem, a kroki osi zawsze zwracają tylko węzły. Dlatego kropka nie może być zdefiniowana jako self::item(). To naprawdę musi być specjalna konstrukcja językowa.

Powiązane problemy