Как получить наибольшую / наименьшую дату из списка через запятую - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть строка дат, разделенных запятой (,) Это выглядит как "20180116,20180115,20180126"

Мне нужно получить самую маленькую дату и самую большую дату из этой строки.Использование xslt 2.0

Код XSLT выглядит следующим образом:

<xsl:variable name="allDates"><xsl:value-of select="20180116,20180115,20180126"/> </xsl:variable>


<xsl:function name="getLicencingWindowStart">
    <xsl:param name="dates" />
    <xsl:variable name="smallestDateSort" select="tokenize(normalize-space($dates),',')" />
    <xsl:for-each select="$smallestDateSort">
        <xsl:sort select="." order="descending"/>
        <xsl:if test="position() = last()">
            <xsl:value-of select="."/>
        </xsl:if>
        <xsl:if test="position() = 1">
            <xsl:value-of select="."/>
        </xsl:if>
    </xsl:for-each>
</xsl:function>

o / p:

Ожидаемый результат:

Наименьшее значение: "20180115"

самый большой: "20180126"

o / p:

<App_Data App="VOD" Name="smallestDate" Value=""/>
<App_Data App="VOD" Name="largestdate" Value="20180126"/>

1 Ответ

0 голосов
/ 10 апреля 2019

Предполагая ваш ввод как

<?xml version="1.0" encoding="UTF-8"?>
<root>20190101,20190201,2019051,20190401</root>

Одним из способов достижения желаемого результата может быть:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes" />

<xsl:template match="/">
    <xsl:variable name="date" select="tokenize(normalize-space(/root),',')" />

    <xsl:for-each select="$date">
        <xsl:sort select="." order="descending" />
        <xsl:if test="position() = last()">
            Smallest: <xsl:value-of select="." />
        </xsl:if>
        <xsl:if test="position() = 1">
            Largest: <xsl:value-of select="." />
        </xsl:if>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Edit:

Согласно вашему комментарию, если вы хотите использовать функции xslt 2.0 (мин. И макс.), То же самое может быть достигнуто как

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes" />

<xsl:template match="/">
    <xsl:variable name="date" select="tokenize(normalize-space(/root),',')" />

    Largest: <xsl:sequence select="max($date)"/>
    Smallest: <xsl:sequence select="min($date)"/>

</xsl:template>
</xsl:stylesheet>
...