xslt基于日期计算值

时间:2012-08-22 22:04:15

标签: 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

3 个答案:

答案 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>

答案 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: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

答案 2 :(得分: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版本和引擎。