7

たとえば、映画を含む xml データベースがあります。

<film id="5">
        <title>The Avengers</title>
        <date>2012-09-24</date>
        <family>Comics</family>
</film>

Perl スクリプトから、日付で映画を検索したい。たとえば、正確な年の映画を検索すると、次のようになります。

my $query = "//collection/film[date = 2012]";

それは正確に機能し、2012 年のすべての映画を返しますが、1 年より前にすべての映画を検索すると、機能しませんでした。たとえば、次のようになります。

my $query = "//collection/film[date < 2012]";

それはすべてのフィルムを返します..

4

3 に答える 3

4

まあ、いつものように、それを行うには複数の方法があります。) 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 と同じです。)

ただし、これは他の比較演算子では機能しません。そのため、部分文字列を使用するか、日付文字列を数値に変換する必要があります。最初のアプローチの方が読みやすく、おそらく高速であると思いました。)

于 2012-06-24T14:43:07.783 に答える
1

年を確認するには、この XPath を使用します

//collection/film[substring-before(date, '-') &lt; '2012']

あなたのPerlスクリプトは、

my $query = "//collection/film[substring-before(date, '-') &lt; '2012']";

また

my $query = "//collection/film[substring-before(date, '-') = '2012']";
于 2012-06-24T14:54:06.110 に答える
0

単に使用してください:

//collection/film[translate(date, '-', '') < 20120101]

これにより、日付からダッシュが削除され、2012-01-01未満であるかどうかが比較されます(ダッシュが削除されています)。

同様に、特定の日付(年だけでなく)より前の日付のすべての映画を取得できます。

//collection/film[translate(date, '-', '') < translate($theDate, '-', '']
于 2012-06-24T15:17:08.190 に答える