Sam
Sam

Reputation: 841

How to Ignore Month in complete date function in XSLT

How Can Ignore Month (e.g. Jan, Feb, .. Dec) in complete date function. Because requirement is descending order only year and day my input last two lines s/b first is (Sept. 24, 2015,) and after that (Oct. 1, 2015,).
Input XML

<root>
<p content-type="emCase"><named-content content-type="emEntry">A.H. Emery Co. v Marcan Prods. Corp. (SD NY 1967) 268 F Supp 289, aff&#x2019;d (2d Cir 1968) 389 F2d 11:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1994) 23 CA4th 51:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1996) 13 C4th 1017:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Mendoza v Nordstrom, Inc. (2017) 2 C5th 1074:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Mendoza v Nordstrom, Inc. (2018) 2 C5th 1074:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Mendoza v Nordstrom, Inc. (9th Cir 2017) 865 F3d 1261:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Frlekin v Apple, Inc. (9th Cir 2017) 870 F3d 867:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Frlekin v Apple, Inc. (review granted Sept. 20, 2017, S243805) 2017 Cal Lexis 7496:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Bradford Technols., Inc. v NCV Software.com (ND Cal, Aug. 6, 2013, No. C 11&#x2013;04621 EDL) 2013 US Dist Lexis 111502:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Bradford Technols., Inc. v NCV Software.com (ND Cal, Jan. 4, 2013, No. C 11&#x2013;04621 EDL) 2013 US Dist Lexis 1592:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Appler v Mead Johnson &amp; Co., LLC (SD Ind, Oct. 1, 2015, No. 3:14&#x2013;cv&#x2013;166&#x2013;RLY-WGH) 2015 US Dist Lexis 133769:</named-content></p>
<p content-type="emCase"><named-content content-type="emEntry">Appler v Mead Johnson &amp; Co., LLC (SD Ind, Sept. 24, 2015, No. 3:14&#x2013;cv&#x2013;166&#x2013;RLY-WGH) 2015 US Dist Lexis 128182:</named-content></p>
</root>

XSLT

    <xsl:param name="months" as="xs:string*"
  select="'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'"/>

<xsl:param name="date-pattern" as="xs:string"
  select="'\((.*?)((' || string-join($months, '|') || ')\. ([0-9]{1,2}), ([0-9]{4})).*?\)'"/>

<xsl:output indent="yes"/>

<xsl:function name="mf:extract-date" as="xs:date?">
    <xsl:param name="input" as="xs:string"/>
    <xsl:sequence
        select="let $match := analyze-string($input, $date-pattern)/*:match[1]
                return 
                if ($match) 
                then xs:date(
                        $match//*:group[@nr = 5] 
                        || '-' || format-integer(index-of($months, $match//*:group[@nr = 3]), '00') 
                        || '-' || format-integer($match//*:group[@nr = 4], '00'))
                else ()"/>
</xsl:function>

<xsl:function name="mf:extract-year" as="xs:integer?">
    <xsl:param name="input" as="xs:string"/>
    <xsl:sequence
        select="analyze-string($input, '\((.*?)([0-9]{4})\)')/*:match[1]/*:group[@nr = 2]"/>
</xsl:function>

<xsl:function name="mf:extract-sort" as="xs:string?">
    <xsl:param name="input" as="xs:string"/>
    <xsl:sequence
        select="analyze-string($input, '\((.*?)\)')/*:match[1]/*:group[@nr = 1]"/>
</xsl:function>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="root">
    <xsl:copy>
        <xsl:for-each-group select="p" group-adjacent="substring-before(named-content[@content-type = 'emEntry'], '(')">
            <xsl:apply-templates select="current-group()">
                <xsl:sort select="let $year := mf:extract-year(.)
                    return if ($year) then -$year else 1"/>
                <xsl:sort select="let $date := mf:extract-date(.)
                    return if (exists($date)) then $date else 1" order="descending"/>
                <xsl:sort select="let $sort := mf:extract-sort(.)
                    return if ($sort) then $sort else 1" order="descending"/>
            </xsl:apply-templates>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

Expected Output

<root>
   <p content-type="emCase">
      <named-content content-type="emEntry">A.H. Emery Co. v Marcan Prods. Corp. (SD NY 1967) 268 F Supp 289, aff’d (2d Cir 1968) 389 F2d 11:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1996) 13 C4th 1017:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">AFL-CIO v Unemployment Ins. Appeals Bd. (1994) 23 CA4th 51:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Mendoza v Nordstrom, Inc. (2018) 2 C5th 1074:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Mendoza v Nordstrom, Inc. (9th Cir 2017) 865 F3d 1261:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Mendoza v Nordstrom, Inc. (2017) 2 C5th 1074:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Frlekin v Apple, Inc. (review granted Sept. 20, 2017, S243805) 2017 Cal Lexis 7496:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Frlekin v Apple, Inc. (9th Cir 2017) 870 F3d 867:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Bradford Technols., Inc. v NCV Software.com (ND Cal, Aug. 6, 2013, No. C 11–04621 EDL) 2013 US Dist Lexis 111502:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Bradford Technols., Inc. v NCV Software.com (ND Cal, Jan. 4, 2013, No. C 11–04621 EDL) 2013 US Dist Lexis 1592:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Appler v Mead Johnson &amp; Co., LLC (SD Ind, Sept. 24, 2015, No. 3:14–cv–166–RLY-WGH) 2015 US Dist Lexis 128182:</named-content>
   </p>
   <p content-type="emCase">
      <named-content content-type="emEntry">Appler v Mead Johnson &amp; Co., LLC (SD Ind, Oct. 1, 2015, No. 3:14–cv–166–RLY-WGH) 2015 US Dist Lexis 133769:</named-content>
   </p>
</root>

Code: https://xsltfiddle.liberty-development.net/pNmC4Jf/17

Upvotes: 1

Views: 36

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167696

Instead of the date sort key used in

<xsl:sort select="let $date := mf:extract-date(.)
                  return if (exists($date)) then $date else 1" order="descending"/>

simply compare the day

<xsl:sort select="let $date := mf:extract-date(.)
                  return if (exists($date)) then day-from-date($date) else 1" order="descending"/>

The year is already used in the first key.

Upvotes: 1

Related Questions