XSLT在特定日期之前获取数据

时间:2019-03-20 12:07:41

标签: xml xslt xslt-1.0

我正在尝试在特定日期之前获取数据。因此,应该显示该日期之后元素内的任何数据,否则不显示。这就是我想要做的:

<xsl:for-each select="//magadvert">
    <xsl:if test="releaseDate > 2018-09-15">
        <tr>
            ...Do Something
        </tr>
    </xsl:if>
</xsl:for-each>

数据:

<magadvert advertID="1">
    <releaseDate>2018-06-22</releaseDate>
    <endDate>2018-09-08</endDate>
    <magName>Phasellus At Augue Industries</magName>
    <advertSize>3971.69</advertSize>
    <position>Inside front</position>
    <magCost>35217.49</magCost>
    <issuesAppeared>11</issuesAppeared>
</magadvert>

在架构中,“ releaseDate”的类型为 xs:date 。每当我尝试运行此条件时,它都将返回空结果,就好像从未满足此条件一样,而数据中有此日期之后的条目。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

XSLT 1.0不能识别日期。进行releaseDate > 2018-09-15实际上与进行releaseDate > 1992相同(因为它被解析为数字表达式,并且2018-09-15 = 1992)

您可以尝试将其放在撇号中,例如releaseDate > '2018-09-15',但这也不起作用,因为在XSLT 1.0中字符串比较受到限制,因此>运算符不适用于字符串。 / p>

因此,您可以(在XSLT 1.0中)将字符串转换为数字(通过删除连字符)并进行数字比较

<xsl:if test="number(translate(releaseDate, '-', '')) > 20180915">

或者,升级到使用可以处理日期的XSLT 2.0,然后您可以...

<xsl:if test="xs:date(releaseDate) > xs:date('2018-09-15')">

请注意,顺便说一句,您可以将if条件放在xsl:for-each本身

<xsl:for-each select="//magadvert[number(translate(releaseDate, '-', '')) > 20180915]">