XPath日期比较

19

我想基于一个日期格式为yyyy-MM-dd的属性来过滤元素。

我的XML文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <article title="wired" pub-date="2010-11-22" />
  <article title="Plus 24" pub-date="2010-11-22" />
  <article title="Finance" pub-date="2010-10-25" />
</root>

我的xpath尝试:

'//article[xs:date(./@pub-date) > xs:date("2010-11-15")]'

使用xpath 2.0-除非绝对必要,否则不建议添加架构。

来自评论:

我相信我可能遗漏了什么。那么,有可能需要指定其他内容才能使xs:date正常工作吗?也许是xs:命名空间定义?


2
@Razor:问题是什么?我这里没有问题,只是风格:不会使用以./开头的步骤,仅为简洁起见,可以使用(对于其他表达式).//代替descendant:: - user357812
1
你的XPath 2.0表达式可以使用,不过我会用//article[xs:date(@pub-date) gt xs:date("2010-11-15")],因为这个更短更紧凑。 - Martin Honnen
在 Oxygen/XML 中对我有效。你为什么认为这不起作用? - Jim Garrison
我相信我可能漏掉了什么。xs:date需要指定其他内容才能正常工作吗?也许需要一个xs:命名空间定义? - Razor
1
@Razor:是的,是的,是的... - user357812
2个回答

33

在 XPath 1.0 和 2.0 中,您都可以使用:

//article[number(translate(@pub-date,'-','')) > 20101115]

您的XPath 2.0表达式是正确的,在使用Saxon 9.0.3进行转换时:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xsl:template match="/">
      <xsl:sequence select="//article[xs:date(./@pub-date) > xs:date('2010-11-15')]"/>
    </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<root>
  <article title="wired" pub-date="2010-11-22" />
  <article title="Plus 24" pub-date="2010-11-22" />
  <article title="Finance" pub-date="2010-10-25" />
</root>

能够生成所需的、正确的结果:

<article title="wired" pub-date="2010-11-22"/>
<article title="Plus 24" pub-date="2010-11-22"/>

不错的解决方案,+1 - 虽然这只是一个变通方法,但如果我找不到我的代码有什么问题,我会将其标记为答案。 - Razor
@Razor:我已经更新了我的答案,并提供了一个完整的XSLT 2.0解决方案,展示了你的XPath 2.0表达式是正确的。 - Dimitre Novatchev
即使添加了内联XML模式,仍然无法工作,因此问题必须是我的xpath解析器(velocity XMLtool)。您的第一个解决方案几乎可以工作-在关闭]之前有一个额外的),请更正它,我将把它标记为答案。 - Razor

2
<cfset startdatetime = Now() >
<cfset nNow = LSParseNumber(DateFormat(DateAdd('n', -15,startdatetime),'yyyyMMddHHmm')) >

number(substring(concat(translate(text(),'-: ',''),'0000000000000000'),1,12))<=#nNow#

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接