Cóż, jak zwykle, jest więcej niż jeden sposób, aby to zrobić.) Albo niech narzędzie XPath wiedzieć, że powinien porównać dat (nie wiem od początku) z mniej więcej tak:
my $query = '//collection/film[xs:date(./date) < xs:date("2012-01-01")]';
... lub po prostu zacisnąć zęby i po prostu porównywać „yyyy” podciągi:
my $query = '//collection/film[substring(date, 1, 4) < "2012"]';
były to lepiej semantycznie, jak sądzę, ale wymaga zaawansowanych funkcji parsera XML, który obsługuje XPath 2.0. Ta ostatnia została pomyślnie zweryfikowana za pomocą XML :: XPath.
AKTUALIZACJA: Chciałbym podać wyjaśnienie, dlaczego działa pierwsze zapytanie.) Widzisz, nie porównujesz tam dat - porównujesz liczby, ale tylko z powodu operatora "=". Cytat the doc:
Kiedy ani przedmiot należy porównać to zestaw węzłów i operator = lub =, a następnie obiekty są porównywane poprzez przekształcenie ich do wspólnego typu następująco a następnie porównując je! . Jeśli przynajmniej jeden obiekt do porównania jest wartością logiczną, to każdy porównywany obiekt jest konwertowany na na wartość logiczną, jak przy użyciu funkcji boolowskiej. W przeciwnym razie, jeśli co najmniej jeden obiekt do porównania jest liczbą, to każdy obiekt, który ma być porównywany, zostanie przekonwertowany na liczbę tak, jak przy użyciu funkcji o numerze: .
Zobacz? Twój numer "2012-09-24" został przekonwertowany na numer - i stał się numerem 2012. Co, oczywiście, jest równy rokowi 2012.)
Nie działa to z żadnymi innymi operatorami porównawczymi: dlatego musisz albo użyj podłańcucha, albo przekonwertuj ciąg daty na liczbę. Sądziłem, że pierwsze podejście będzie łatwiejsze do odczytania, a może i szybsze.)
pokrewne: http://stackoverflow.com/questions/4347320/xpath-dates -porównywalne – dusan