XSLT1.0/XPath 1.0按日期范围选择节点.这甚至可能吗?

Cas*_*dan 6 xslt xpath

假设我有一个包含属性datetime的节点列表,我想只选择$ compare-datetime之后出现的记录.

<records>
    <record @datetime="2010-01-04T16:48:15.501-05:00"/>
    <record @datetime="2010-01-03T16:48:15.501-05:00"/>
    ...etc...
</records>
Run Code Online (Sandbox Code Playgroud)

在xquery中我可以选择日期范围内的项目

/records/record[xs:dateTime(@datetime) > xs:dateTime($compare-datetime)]
Run Code Online (Sandbox Code Playgroud)

然而,在XSLT 1.0中,我尝试了很多不同的方法,并且很多都在寻找答案,没有任何运气可以让它发挥作用.

我开始认为没有将实际的dateTime解析为整数值,这在xslt中不是一个简单的任务.

我希望有人可以给我一个明确的答案,所以我至少可以知道我的反对意见.

干杯,

卡西

Lar*_*rsH 7

如果日期将始终位于同一时区,并且具有固定宽度字段(每个字段中的常数位数),我相信您可以采用这种方法:删除标点符号,保留数字,并比较数字.

<xsl:variable name="datetime-punctuation" select="'-.:T'" />
<xsl:variable name="stripped-compare-datetime"
  select="number(translate($compare-datetime, $datetime-punctuation, ''))" />
Run Code Online (Sandbox Code Playgroud)

然后用

/records/record[number(translate(@datetime, $datetime-punctuation, ''))
                 > $stripped-compare-datetime)]
Run Code Online (Sandbox Code Playgroud)


Fla*_*ack 5

可能它不是最好的解决方案,但我有这个:

XML输入:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="dates.xsl"?>
<records>
    <record datetime="2010-01-04T16:48:15.501-05:00"/>
    <record datetime="2011-01-04T16:48:15.501-05:00"/>
</records>
Run Code Online (Sandbox Code Playgroud)

XSLT:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:date="http://exslt.org/dates-and-times"
    extension-element-prefixes="date">
    <xsl:import href="date.difference.template.xsl"/>
    <!-- http://exslt.org/date/functions/difference/date.difference.template.xsl -->
    <xsl:output method="xml" indent="yes"/>        

    <xsl:template match="/*">
        <xsl:copy>
            <result1>
                <xsl:call-template name="date:difference">
                   <xsl:with-param name="start" select="record[1]/@datetime"/>
                   <xsl:with-param name="end" select="'2010-04-04T16:48:15.501-05:00'"/>
                </xsl:call-template>
            </result1>
            <result2>
                <xsl:call-template name="date:difference">
                   <xsl:with-param name="start" select="record[2]/@datetime"/>
                   <xsl:with-param name="end" select="'2010-04-04T16:48:15.501-05:00'"/>
                </xsl:call-template>
            </result2>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

结果:

<records>
    <result1>P90D</result1>
    <result2>-P275D</result2>
</records>
Run Code Online (Sandbox Code Playgroud)

负差异意味着第一个日期发生在第二个日期之后.