xsltを使用して、最新の日付をNヶ月で表示する必要があります。xsltのN月の最新日付を表示する方法は?
マイ入力:
2016/10/18
2016//10/15
2016/09/29
2016/09/15
のように。
私の出力は以下のようにする必要があります:
2016/10/18
2016/09/29
誰もがこの上で私を助けることができますか?
xsltを使用して、最新の日付をNヶ月で表示する必要があります。xsltのN月の最新日付を表示する方法は?
マイ入力:
2016/10/18
2016//10/15
2016/09/29
2016/09/15
のように。
私の出力は以下のようにする必要があります:
2016/10/18
2016/09/29
誰もがこの上で私を助けることができますか?
最初にトークン化して日付値を抽出し、次に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>
:ここ
<?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>
I.は短いXSLT 2.0ソリューションです。この変換は、以下の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>
:
<d>2016/10/18</d>
<d>2017/09/17</d>
II。 同月の最高の日を持っている日付が望まれる場合 - に関係なく、年の、この変換:
<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>
この変換は、(上記)と同じXML文書に適用されたときに、正しい結果があります生成:
<d>2016/10/18</d>
<d>2016/09/29</d>
III。日付が文字列としてまとめられている場合:
標準のXPath 2.0 fy = unactionを使用してください。tokenize()
例えば、上記第1の変換の等価になる:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vDates"
select="'2016/10/15 2016/09/15 2016/10/18 2016/09/29 2017/09/17'"/>
<xsl:template match="/">
<xsl:for-each-group select="tokenize($vDates, '\s+')[.]" group-by="substring(.,6,2)">
<xsl:sequence select="max(current-group())"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>