我需要使用xslt显示N个月的最新日期。
我的意见:
2016/10/18
2016//10/15
2016/09/29
2016/09/15
等等。
我的输出应如下所示:
2016/10/18
2016/09/29
有人可以帮我吗?
答案 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=" "/>
</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=" "/>
</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()