如何在xslt中显示N个月的最新日期?

时间:2016-10-18 13:11:44

标签: xslt-2.0

我需要使用xslt显示N个月的最新日期。

我的意见:

2016/10/18
2016//10/15
2016/09/29
2016/09/15

等等。

我的输出应如下所示:

2016/10/18
2016/09/29

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

给定该格式的一串日期,您首先需要标记化以提取日期值,然后您需要转换为xs:date格式,然后您可以按月分组并选择每个日期中的最大值组。使用XSLT 3.0可以按如下方式完成:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:param name="input" as="xs:string">2016/10/18 2016/10/15 2016/09/29 2016/09/15</xsl:param>
    <xsl:variable name="dates" as="xs:date*"
        select="tokenize($input, '\s+')!xs:date(replace(., '/', '-'))"/>

    <xsl:variable name="max-dates" as="xs:date*">
        <xsl:for-each-group select="$dates" group-by="month-from-date(.)">
            <xsl:sort select="current-grouping-key()"/>
            <xsl:sequence select="max(current-group())"/>
        </xsl:for-each-group>
    </xsl:variable>

    <xsl:template name="main" match="/">
        <xsl:value-of select="$max-dates" separator="&#10;"/>
    </xsl:template>

</xsl:stylesheet>

在XSLT 2.0中,您需要稍微重写日期序列构造:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="2.0">

    <xsl:param name="input" as="xs:string">2016/10/18 2016/10/15 2016/09/29 2016/09/15</xsl:param>
    <xsl:variable name="dates" as="xs:date*"
        select="for $dateString in tokenize($input, '\s+') return xs:date(replace($dateString, '/', '-'))"/>

    <xsl:variable name="max-dates" as="xs:date*">
        <xsl:for-each-group select="$dates" group-by="month-from-date(.)">
            <xsl:sort select="current-grouping-key()"/>
            <xsl:sequence select="max(current-group())"/>
        </xsl:for-each-group>
    </xsl:variable>

    <xsl:template name="main" match="/">
        <xsl:value-of select="$max-dates" separator="&#10;"/>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

<强>予。这是一个简短的XSLT 2.0解决方案:

     var questions = [
     {
        quest: "Which of the following is an actual movie?",
        answer: "A. Jaws",
        choices: ["A. Jaws", "B. Laws", "C. Paws", "D. Claws"],
        video: "<iframe width: 200px height: 100px src = 'https://www.youtube.com/embed/2I91DJZKRxs' allowfullscreen></iframe>"
     },
     {
        quest: "Which of the following is an actual movie?",
        answer: "B. For a Few Dollars More",
        choices: ["A. Gummy Bears", "B. For a Few Dollars More", "C. What?", "D. I dont care"],
        video: "<iframe width: 200px height: 100px src= 'https://www.youtube.com/embed/M-k_BW8iLkk' allowfullscreen></iframe>"
     },
     {
        quest: "Which of the following is an actual movie?",
        answer: "D. Pineapple Express",
        choices: ["A. The Mining", "B. The Natrix", "C. Huh?", "D. Pineapple Express"],
        video: "<iframe width: 200px height: 100px src='https://www.youtube.com/embed/8TUTxAK1EqQ' allowfullscreen></iframe>"
     }
     ]

将此转换应用于以下XML文档(无序和多年日期 - 以使其更有趣):

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

  <xsl:template match="/*">
    <xsl:for-each-group select="d" group-by="substring(.,6,2)">
      <xsl:sequence select="current-group()[. eq max(current-group()/string())][1]"/>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

产生了想要的正确结果

<t>
    <d>2016/10/15</d>
    <d>2016/09/15</d>
    <d>2016/10/18</d>
    <d>2016/09/29</d>
    <d>2017/09/17</d>
</t>

II。 如果需要具有相同月份最高日期的日期 - 无论年份如何,此转换

<d>2016/10/18</d>
<d>2017/09/17</d>

将此转换应用于同一XML文档(上图)时,会生成正确的结果

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

  <xsl:template match="/*">
    <xsl:for-each-group select="d" group-by="substring(.,6,2)">
      <xsl:sequence select=
          "current-group()[substring(.,9,2) eq max(current-group()/substring(.,9,2))][1]"/>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

<强> III。如果日期一起作为字符串:

只需使用<d>2016/10/18</d> <d>2016/09/29</d> 标准XPath 2.0 fy = unction。

例如,上面第一个转换的等效变为:

tokenize()