XSLT принимает данные до определенной даты - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь получить данные до определенной даты. Поэтому любые данные внутри элементов, которые находятся после этой даты, должны отображаться, в противном случае - нет. Вот что я пытаюсь сделать:

<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 Ответ

2 голосов
/ 20 марта 2019

XSLT 1.0 не распознает даты. Выполнение releaseDate > 2018-09-15 фактически аналогично выполнению releaseDate > 1992 (потому что оно анализируется как числовое выражение, а 2018 - 09 - 15 = 1992)

Вы можете попробовать поместить его в апострофах, например releaseDate > '2018-09-15', но это тоже не сработает, потому что сравнение строк ограничено в XSLT 1.0, и поэтому оператор > не работает с строками.

Итак, что вы можете сделать (в 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]">
...