2010-10-07 86 views
8

Có thể với xslt để lấy trường ngày và trừ số ngày N từ ngày đó không? Nếu vậy, bạn có thể vui lòng cung cấp cho tôi một ví dụ không?xslt - trừ các ngày

+0

Bạn đang sử dụng bộ xử lý XSLT nào? –

+0

XSLT 1.0 hoặc XSLT 2.0? Định dạng ngày tháng là gì? –

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho một giải pháp XSLT 2.0 hoàn chỉnh. –

Trả lời

13

Dưới đây là một minh chứng làm thế nào để làm điều này trong XSLT 2.0:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:variable name="vToday" select="current-date()"/> 

    Today is: <xsl:sequence select="$vToday"/> 
    30 days ago it was: <xsl:sequence select= 
    "$vToday -30*xs:dayTimeDuration('P1D')"/> 
    365 days ago it was: <xsl:sequence select= 
    "$vToday -365*xs:dayTimeDuration('P1D')"/> 
</xsl:template> 
</xsl:stylesheet> 

khi chuyển đổi này được áp dụng trên bất kỳ tài liệu XML nào (không được sử dụng), kết quả mong muốn, chính xác được tạo ra:

Today is: 2010-10-07-07:00 
    30 days ago it was: 2010-09-07-07:00 
    365 days ago it was: 2009-10-07-07:00 
+0

+1 Câu trả lời hay! –

+0

FYI ... '' gây ra một trang trống trong Firefox 25 và Chrome 30. Firefox đưa ra lỗi giao diện điều khiển của 'Mã lỗi trả về thành phần: 0x80600005 [nsIXSLTProcessor.importStylesheet] '. Rất tiếc, dường như bạn phải chỉ định 'version =" 2.0 "' trong 'xsl: stylesheet'. Tôi đang sử dụng phiên bản 1.0. – doubleJ

+0

FYI2 ... Ngay cả với 'phiên bản = 2.0' được chỉ định, Chrome 30 tạo một trang trống. Tuy nhiên, Firefox 25 hiển thị kết quả. – doubleJ

1

Vâng, XSLT có thể chia chuỗi và phân tích cú pháp số, do đó, có, nó sẽ là "có thể".

Tuy nhiên, sẽ dễ dàng hơn và hiệu quả hơn nếu bạn có thể sử dụng các chức năng mở rộng và triển khai thực hiện bằng ngôn ngữ khác. Tuy nhiên, nếu và cách hoạt động phụ thuộc vào công cụ XSLT được sử dụng.

EXSLT có thể có mọi thứ bạn cần: http://www.exslt.org/date/functions/add/index.html

5

Vâng, với XSLT 2.0 nó là có thể, và rất dễ dàng để làm.

Có rất nhiều Date/Time/Duration functions in XPATH 2.0, là một phần của XSLT 2.0.

dụ này sẽ trừ 1 ngày kể từ ngày 2010/1/1 để sản xuất 2009/12/31:

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:template match="/"> 
    <xsl:value-of select="xs:date('2010-01-01') - xs:dayTimeDuration('P1D')" /> 
</xsl:template> 
</xsl:stylesheet> 
-2
<xsl:template name="dim" > 

    <xsl:param name="y" /> 
    <xsl:param name="m"/> 

    <xsl:choose> 
    <xsl:when test="($m=1 or $m=3 or $m=5 or $m=7 or $m=8 or $m=10 or $m=12)" > 
      31 
    </xsl:when> 
    <xsl:when test="$m&gt;2"> 
     30 
    </xsl:when> 
    <xsl:when test="($m=2) and (not($y mod 4=0)) or ($y mod 100=0) and (not($y mod 400=0))"> 
     28 
    </xsl:when> 
    <xsl:otherwise> 
     29 
    </xsl:otherwise> 
    </xsl:choose> 

</xsl:template> 


<xsl:template name="minusdays"> 
<xsl:param name="year" /> 
<xsl:param name="month" /> 
<xsl:param name="day"/> 
<xsl:param name="days"/> 
<xsl:variable name="lm" select="number($month)-1+number($month=1)*12"/> 

<xsl:variable name="lmdays"> 
    <xsl:call-template name="dim"> 
     <xsl:with-param name="y" select="$year"/> 
     <xsl:with-param name="m" select="$lm"/> 
    </xsl:call-template> 
</xsl:variable> 

<xsl:choose> 
    <xsl:when test="$days&lt;$day"> 
     <xsl:value-of select="$year"/> 
     <xsl:if test="number($month)&lt;10">0</xsl:if> 
     <xsl:value-of select="$month"/> 
     <xsl:if test="($day - $days)&lt;10">0</xsl:if> 
     <xsl:value-of select="$day - $days"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:call-template name="minusdays"> 
      <xsl:with-param name="year" 
      select="number($year)-number($month=1)"/> 
     <xsl:with-param name="month" select="$lm" /> 
     <xsl:with-param name="day" select="$lmdays"/> 
     <xsl:with-param name="days" select="$days - $day" />  
     </xsl:call-template> 
    </xsl:otherwise> 
</xsl:choose> 

</xsl:template> 
0

Tôi có thể thấy rằng tất cả các giải pháp được đề cập là dành cho XSLT 2.0. Tôi có giải pháp tương tự cho XSLT 1.0 sử dụng EXSLT ngày: thêm

Ví dụ: Hãy xem số ngày bị trừ là 365 và chúng tôi cần nó là ngày bắt đầu mặc định. Trong trường hợp này, chúng tôi phải cung cấp thời lượng 365 ngày theo định dạng xs: dayTimeDuration tức là '-P365D'.

Vui lòng tìm bên dưới mã.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:date="http://exslt.org/dates-and-times" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
extension-element-prefixes="date xs" 
exclude-result-prefixes="date xs" version="1.0"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" /> 

    <xsl:template match="/"> 
     <xsl:variable name="vCurrDate" select="date:date-time()"/> 
     <xsl:variable name="vDefaultStDate" select="(date:add($vCurrDate, '-P365D'))"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Thật không may, rất ít bộ xử lý XSLT 1.0 hỗ trợ EXSLT 'date: add()'. Đối với một giải pháp XSLT 1.0 thuần túy, không có phần mở rộng, hãy xem: https://stackoverflow.com/questions/23566734/date-operations-on-xsl-1-0/23569278#23569278 –