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

これがXSLT2.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

このXSLT1.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 に答える