Bueno, como de costumbre, hay más de una manera de hacerlo.) O dejas herramienta XPath sabe que debe comparar las fechas (no se sabe desde el principio) con algo como esto:
my $query = '//collection/film[xs:date(./date) < xs:date("2012-01-01")]';
... o simplemente de tripas corazón y simplemente comparar el 'aaaa' subseries:
my $query = '//collection/film[substring(date, 1, 4) < "2012"]';
el primero es mejor semánticamente, supongo, pero requiere una herramienta de analizador XML avanzada que soporta XPath 2.0. Y el último se verificó con éxito con XML :: XPath.
ACTUALIZACIÓN: Me gustaría dar mi explicación de por qué funciona su primera consulta.) Ver, no se comparan fechas allí - se comparan los números, pero solo por el operador '='. Presupuesto de the doc:
Cuando ni objeto a comparar es un conjunto de nodos y el operador es = o =, entonces los objetos se comparan mediante la conversión a un común tipo de la siguiente manera y luego compararlos! . Si al menos un objeto para ser comparado es un booleano, entonces cada objeto a comparar se convierte en un booleano como si aplicara la función booleana. De lo contrario, si al menos un objeto para comparar es un número, entonces cada objeto que se comparó se convierte a un número como si aplicara la función número .
Ver? Su '2012-09-24' se convirtió en número, y se convirtió en 2012. Lo que, por supuesto, es igual a 2012.)
Esto no funciona con ningún otro operador comparativo, sin embargo: es por eso que necesita use subcadena o convierta la cadena de fecha en número. Supuse que el primer enfoque sería más legible, y más rápido también, tal vez.)
relacionadas: http://stackoverflow.com/questions/4347320/xpath-dates -comparación – dusan