Perl Xpath:日期年份之前的搜索项目

前端之家收集整理的这篇文章主要介绍了Perl Xpath:日期年份之前的搜索项目前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含电影的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年的所有电影,但如果我在一年之前搜索所有电影,它就不起作用,例如:

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

它返回所有电影..

解决方法

好吧,像往常一样,有不止一种方法可以做到这一点. )要么让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成功验证.

更新:我想解释为什么你的第一个查询有效. )看,你不比较那里的日期 – 你比较数字,但只是因为’=’运算符.引自the doc

When neither object to be compared is a node-set and the operator is =
or !=,then the objects are compared by converting them to a common
type as follows and then comparing them. If at least one object to be
compared is a boolean,then each object to be compared is converted to
a boolean as if by applying the boolean function. Otherwise,if at
least one object to be compared is a number,then each object to be
compared is converted to a number as if by applying the number
function.

看到?您的’2012-09-24’已转换为数字 – 并成为2012年.当然,这相当于2012年.)

但这不适用于任何其他比较运算符:这就是为什么你需要使用substring,或者将date-string转换为数字.我认为第一种方法可能更具可读性 – 也许更快. )

猜你在找的Perl相关文章