2012-08-22 24 views
1

美好的一天,XSLT的計算值的日期

我有一個XML文件,它看起來像:

<albums xmlns="http://www.someurl.com/schema"> 
    <album> 
     <artist>Rush</artist> 
     <name>Moving Pictures</name> 
     <releaseDate>05-31-1981</releaseDate> 
    <album> 
</albums> 

我要的是用XLST顯示藝術家的名字,多少歲月自發布之日起已經開始。

<div id="recordInfo"> 
    <div class="col"><xsl:value-of select="/t:albums/t:album/t:artist"></div> 
    <div class="col"><xsl:value-of select="/t:albums/t:album/t:name"></div> 
    <!-- I want the value of 31 here --> 
</div>  

有沒有人有任何想法如何在XSLT中做到這一點?

TIA,

COSON

+0

coson,這需要解釋 - 如果今天是01-01-2013,發佈日期是2012年12月31日,您真的希望結果爲1年嗎?這可能看起來很奇怪,因爲實際持續時間實際上只有一天。 –

+0

Dimitre,這是一個很好的觀點,當我發佈這個問題時我沒有考慮到這一點。我正在使用的大部分數據將至少兩年前。但是,在這種情況下,值將爲0. – coson

+0

Dimitre,還有一點,下面的url幫助我解決了我的問題,因爲我使用的是XSLT 1.0。 http://geekswithblogs.net/lszk/archive/2011/08/24/using-custom-functions-in-xsl.aspx – coson

回答

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 omit-xml-declaration="yes" indent="yes"/> 

    <xsl:variable name="vTokens" select="tokenize(/*, '-')"/> 
    <xsl:variable name="vDate" select= 
    "string-join(($vTokens[3], $vTokens[1], $vTokens[2]), '-')"/> 

<xsl:template match="/*"> 
    <xsl:sequence select= 
    "floor((current-date() - xs:date($vDate)) div xs:dayTimeDuration('P365D')) "/> 
</xsl:template> 
</xsl:stylesheet> 

當該XML文檔上施加:

<t>05-31-1981</t> 

產生想要的,正確的結果

31 
+0

不幸的是,雖然這是我想要的,但我使用的是仍然綁定到XSLT 1.0的Visual Studio 2010 Professional。 – coson

+0

@coson,可能提供XSLT 1.0解決方案 - 但是我需要您更好地定義問題。是否應將月數四捨五入,以使六個月四捨五入至一年,五個月四捨五入至零年? –

0

下面是一個XSLT 2.0選項...

XML輸入

<albums xmlns="http://www.someurl.com/schema"> 
    <album> 
     <artist>Rush</artist> 
     <name>Moving Pictures</name> 
     <releaseDate>05-31-1981</releaseDate> 
    </album> 
</albums> 

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:t="http://www.someurl.com/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="#all"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="albums"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="t:album"> 
     <div id="recordInfo"> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 

    <xsl:template match="t:artist|t:name"> 
     <div class="col"><xsl:value-of select="."/></div> 
    </xsl:template> 

    <xsl:template match="t:releaseDate"> 
     <xsl:variable name="vOrigDate" select="tokenize(.,'-')"/> 
     <xsl:variable name="vDate" select="xs:date(concat($vOrigDate[3],'-',$vOrigDate[1],'-',$vOrigDate[2]))" as="xs:date"/> 
     <div class="col"><xsl:value-of select="floor(days-from-duration(current-date() - $vDate) div 365)"/></div> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<div id="recordInfo"> 
    <div class="col">Rush</div> 
    <div class="col">Moving Pictures</div> 
    <div class="col">31</div> 
</div> 
+0

不幸的是,雖然這是我想要的,但我使用的是仍然綁定到XSLT 1.0的Visual Studio 2010 Professional。 – coson

+0

@coson - 所以你接受了2。0回答是因爲...? –

0

這XSLT 1.0模板...

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:t="http://www.someurl.com/schema" 
    exclude-result-prefixes="xsl t" > 
<xsl:output method="xml" indent="yes"/> 

<xsl:variable name="current-year" select="2012" /> 

<xsl:template match="/"> 
    <r> 
    <xsl:apply-templates select="t:albums/t:album" /> 
    </r> 
</xsl:template> 

<xsl:template match="t:album"> 
    <div id="recordInfo"> 
    <div class="col"><xsl:value-of select="t:artist" /></div> 
    <div class="col"><xsl:value-of select="t:name" /></div> 
    <div class="col"><xsl:value-of select="$current-year - substring(t:releaseDate,7)" /></div> 
    </div> 
</xsl:template> 

</xsl:stylesheet> 

...會產生這樣的輸出...

<r> 
    <div id="recordInfo"> 
    <div class="col">Rush</div> 
    <div class="col">Moving Pictures</div> 
    <div class="col">31</div> 
    </div> 
</r> 

我已經使用一個變量來存儲日期。在實踐中,您將使用一個函數來獲取當前日期。哪個功能取決於XSLT版本和引擎。

+1

肖恩,在某些情況下,只考慮日期的年份部分很可能不會產生好的結果。 –

+0

好點...... –