2016-10-18 12 views
0

xsltを使用して、最新の日付をNヶ月で表示する必要があります。xsltのN月の最新日付を表示する方法は?

マイ入力:

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

のように。

私の出力は以下のようにする必要があります:

2016/10/18 
2016/09/29 

誰もがこの上で私を助けることができますか?

答えて

0

最初にトークン化して日付値を抽出し、次にxs:date形式に変換する必要がある場合は、月ごとにグループ化して各グループの最大値を選択することができます。以下のように行うことができますXSLT 3.0を使用する:

日付列の建設を少し書き換える必要があり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="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> 

:ここ

<?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> 
0

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> 
関連する問題