xslt

2011-04-04 17 views
7

में 2 तिथियों के बीच अंतर ढूँढना xslt में 2 तिथियों के बीच के दिनों में अंतर खोजने के लिए कम से कम एक कमजोर तरीका है? यदि ऐसा है तो आप मुझे सही दिशा में इंगित कर सकते हैं। मुझे मिमी/डीडी/yyyy के प्रारूप में तिथियां मिल रही हैं।xslt

+1

का परिणाम दे देंगे आप XSLT 1 के साथ फंस या आप कर सकते हैं कर रहे हैं एक्सएसएलटी 2 का प्रयोग करें? –

+4

एक्सएसएलटी 1.0 में आपके पास जेनी टेनीसन द्वारा http://www.exslt.org/date/functions/difference/date.difference.template.xsl –

+0

पर लागू EXSLT 'दिनांक: अंतर 'है I XSLT 2.0/XPath का उपयोग करने की अनुशंसा करता हूं इसके लिए 2.0। –

उत्तर

4

उपयोग XSLT 2.0 (XPath 2.0) इस के लिए:

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

<xsl:template match="/"> 
    <xsl:variable name="vDate1" 
     select="my:dateFromUsDate(/*/d1)"/> 
    <xsl:variable name="vDate2" 
     select="my:dateFromUsDate(/*/d2)"/> 

    <xsl:sequence select= 
    "($vDate1 - $vDate2) div xs:dayTimeDuration('P1D')"/> 
</xsl:template> 

<xsl:function name="my:dateFromUsDate" as="xs:date"> 
    <xsl:param name="pUsDate" as="xs:string"/> 

    <xsl:sequence select= 
    "xs:date(concat(substring($pUsDate,7,4), 
        '-', 
        substring($pUsDate,1,2), 
        '-', 
        substring($pUsDate,4,2) 
       ) 
     ) 
    "/> 
</xsl:function> 
</xsl:stylesheet> 

जब इस बदलाव निम्नलिखित XML दस्तावेज़ पर भी लागू होता है:

<t> 
<d1>04/06/2011</d1> 
<d2>01/11/2010</d2> 
</t> 

चाहता था, सही परिणाम (अंतर 450 दिन है):

450 
+1

वहां केवल एक ही समाधान है जिसने मुझे ओएसबी – Tol182

+0

पर तारीखों के साथ मदद की एक और सही उत्तरदाता - https://stackoverflow.com/questions/38604414/finding-the-difference-between-two-datetimes-in-xslt –

6

एक्सएसएलटी 1.0 के लिए एक अच्छा (और छोटा) विकल्प बराबर जूलियन तिथियों की गणना करना और उन्हें घटाना है।

टेम्पलेट:

<xsl:template name="calculate-julian-day"> 
    <xsl:param name="year"/> 
    <xsl:param name="month"/> 
    <xsl:param name="day"/> 

    <xsl:variable name="a" select="floor((14 - $month) div 12)"/> 
    <xsl:variable name="y" select="$year + 4800 - $a"/> 
    <xsl:variable name="m" select="$month + 12 * $a - 3"/> 

    <xsl:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045"/> 

उपयोग: दूसरे की तारीख के लिए

<xsl:variable name="dateInv" select="'20120406'" /> 
<xsl:call-template name="calculate-julian-day"> 
    <xsl:with-param name="year" select="substring($date,1,4)"/> 
    <xsl:with-param name="month" select="substring($date,5,2)"/> 
    <xsl:with-param name="day" select="substring($date,7,2)"/> 
</xsl:call-template> 

दोहराएँ और आप दो पूर्णांकों होगा। फिर, बस उन्हें घटाएं।

6

यह आसानी से निम्नलिखित अभिव्यक्ति का उपयोग किया जा सकता है:

days-from-duration(xs:date('yyyy-MM-dd')-xs:date('yyyy-MM-dd')) 

उदाहरण के लिए:

days-from-duration(xs:date('2012-06-30')-xs:date('2012-06-18'))