まあ、いつものように、それを行うには複数の方法があります。) XPath ツールに、日付を比較する必要があることを知らせます (最初からわかりません)。
my $query = '//collection/film[xs:date(./date) < xs:date("2012-01-01")]';
...または、弾丸をかじって「yyyy」部分文字列を比較するだけです。
my $query = '//collection/film[substring(date, 1, 4) < "2012"]';
前者の方が意味的に優れていると思いますが、XPath 2.0 をサポートする高度な XML パーサー ツールが必要です。後者は XML::XPath で正常に検証されました。
更新:最初のクエリが機能する理由について説明したいと思います。)ほら、そこで日付を比較しません-数値を比較しますが、それは「=」演算子のためだけです。ドキュメントからの引用:
比較するオブジェクトがどちらもノード集合ではなく、演算子が = または != の場合、次のようにオブジェクトを共通の型に変換して比較することによって比較されます。比較される少なくとも 1 つのオブジェクトがブール値である場合、比較される各オブジェクトは、ブール関数を適用するかのようにブール値に変換されます。それ以外の場合、比較対象の少なくとも 1 つのオブジェクトが数値である場合、比較対象の各オブジェクトは、number 関数を適用したかのように数値に変換されます。
見る?あなたの '2012-09-24' は数値に変換され、2012 になりました。もちろん、これは 2012 と同じです。)
ただし、これは他の比較演算子では機能しません。そのため、部分文字列を使用するか、日付文字列を数値に変換する必要があります。最初のアプローチの方が読みやすく、おそらく高速であると思いました。)