1

再会,

我有一个看起来像这样的 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,

科森

4

3 回答 3

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>
于 2012-08-23T02:49:08.930 回答
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
于 2012-08-23T02:55:24.027 回答
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 版本和引擎。

于 2012-08-23T03:03:51.670 回答