XSLT - 用冒号求和元素值

时间:2015-12-05 14:18:25

标签: xml xslt

我想要元素的总和“时间”。 这是我的xml:

    <document>
<recordlist>
    <bestseller year="2015">
        <plate id="p01" kind="Pop&amp;Rock">
            <title>Atramentowa</title>
            <performer>Celińska Stanisława</performer>
            <release_date>2015-05-08</release_date>
            <distributor idref="d1" />
            <price currency="PLN">37,49</price>
            <year_recorded>2015</year_recorded>
            <availability mp3="1" cd="0" dvd="1" />
            <playlist id="pl01" nazwa="Atramentowa">
                <track id="p01u01">Czerń i biel<time>3:27</time></track>
                <track id="p01u02">Czy o kimś ktoś<time>2:17</time></track>
                <track id="p01u03">Atramentowa rumba<time>5:16</time></track>
                <track id="p01u04">Do rycerzy, do szlachty, do mieszczan<time>3:22</time></track>
                <track id="p01u05">Drzwi odemknij<time>3:21</time></track>
                <track id="p01u06">Moje życie, twoje życie<time>3:19</time></track>
                <track id="p01u07">Obfitość<time>3:20</time></track>
                <track id="p01u08">Jego portret<time>3:15</time></track>
                <track id="p01u09">I znowu on<time>3:11</time></track>
                <track id="p01u10">Nie strasz<time>3:55</time></track>
                <track id="p01u11">Smuteczku mój<time>3:44</time></track>
                <track id="p01u12">Szeptem do mnie mów<time>3:33</time></track>
                <track id="p01u13">Wielka słota<time>3:11</time></track>
                <track id="p01u14">Wakacje z deszczem<time>2:59</time></track>
                <track id="p01u15">Pieśń cygańska<time>3:09</time></track> </playlist>
        </plate>
</bestseller>
</recordlist>
</document>

这是我的xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@* | *[not(node())]"/>

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

<xsl:template match="bestseller/@year | plate/@kind">
     <xsl:element name="{name()}">
          <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

<xsl:template match="//recordlist">
  <xsl:element name="recordlist">
      <xsl:apply-templates select="bestseller"/>
  </xsl:element>
</xsl:template>

<xsl:template match="//plate">
  <xsl:element name="plate">
    <xsl:element name="kind">
        <xsl:value-of select="./@kind"/>
    </xsl:element>
    <xsl:element name="title">
        <xsl:value-of select="./title"/>
    </xsl:element>
    <xsl:element name="performer">
        <xsl:value-of select="./performer"/>
    </xsl:element>
    <xsl:element name="release_date">
        <xsl:value-of select="./release_date"/>
    </xsl:element>
    <xsl:element name="price">
        <xsl:value-of select="./price"/>
    </xsl:element>
    <xsl:element name="year_recorded">
        <xsl:value-of select="./year_recorded"/>
    </xsl:element>
    <xsl:element name="time_duration">
        <xsl:value-of select="sum(*/time)"/>
    </xsl:element>
    <xsl:element name="time_from_release">
        <xsl:value-of select="time"/>
    </xsl:element>
    <xsl:apply-templates select="playlist"/>
  </xsl:element>
</xsl:template>

<xsl:template match="//playlist">
  <xsl:element name="playlist">
    <xsl:for-each select="track">
        <xsl:element name="track">
            <xsl:value-of select="node()"/>
            <xsl:apply-templates select="time"/>
        </xsl:element>
    </xsl:for-each>
  </xsl:element>
</xsl:template>

<xsl:template match="//time">
  <xsl:element name="time">
          <xsl:value-of select="."/>    
  </xsl:element>
</xsl:template>
</xsl:stylesheet>

我希望效果如下:

<?xml version="1.0" encoding="UTF-8"?>
<document>
<recordlist>
<bestseller>
<year>2015</year>
<plate>
<kind>Pop&amp;Rock</kind>
<title>Atramentowa</title>
<performer>Celińska Stanisława</performer>
<release_date>2015-05-08</release_date>
<price>37,49</price>
<year_recorded>2015</year_recorded>
<time_duration>RESLUT</time_duration>
        <time_from_release />
<playlist>
       <track>
          Czerń i biel
          <czas>3:27</czas>
       </track>
       <track>
          Czy o kimś ktoś
          <czas>2:17</czas>
       </track>
       <track>
          Atramentowa rumba
          <czas>5:16</czas>
       </track>
       <track>
          Do rycerzy, do szlachty, do mieszczan
          <czas>3:22</czas>
       </track>
       <track>
          Drzwi odemknij
          <czas>3:21</czas>
       </track>
       <track>
          Moje życie, twoje życie
          <czas>3:19</czas>
       </track>
       <track>
          Obfitość
          <czas>3:20</czas>
       </track>
       <track>
          Jego portret
          <czas>3:15</czas>
       </track>
       <track>
          I znowu on
          <czas>3:11</czas>
       </track>
       <track>
          Nie strasz
          <czas>3:55</czas>
       </track>
       <track>
          Smuteczku mój
          <czas>3:44</czas>
       </track>
       <track>
          Szeptem do mnie mów
          <czas>3:33</czas>
       </track>
       <track>
          Wielka słota
          <czas>3:11</czas>
       </track>
       <track>
          Wakacje z deszczem
          <czas>2:59</czas>
       </track>
       <track>
          Pieśń cygańska
          <czas>3:09</czas>
       </track>
</playlist>
</plate>
</bestseller>
</recordlist>
</document>

在元素“time_duration”中,我希望盘子的总时间像(xx:xx),现在我只有输出等于0.

第二个问题是如何计算元素“release_date”和当前日期之间的差异。我知道我必须添加到样式表

xmlns:datetime="http://exslt.org/dates-and-times"

然后我可以使用函数

current-date()

但是网站http://exslt.org/dates-and-times不存在,所以我不能使用这个功能,对不对?

1 个答案:

答案 0 :(得分:0)

XSLT和XPath 2.0具有xs:dayTimeDuration等数据类型并提供算术运算,请参阅http://xsltransform.net/bFN1y9n的示例

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

    <xsl:template match="plate">
        <xsl:variable name="duration" select="sum(playlist/track/time/xs:dayTimeDuration(concat('PT', substring-before(., ':'), 'M', substring-after(., ':'), 'S')))"/> 
        <duration>
            <xsl:value-of select="format-number(minutes-from-duration($duration), '00'), format-number(seconds-from-duration($duration), '00')" separator=":"/>
        </duration>
    </xsl:template>
</xsl:transform>

并为样本计算<duration>51:19</duration>

<?xml version="1.0" encoding="UTF-8"?>
<plate id="p01" kind="Pop&amp;Rock">
            <title>Atramentowa</title>
            <performer>Celińska Stanisława</performer>
            <release_date>2015-05-08</release_date>
            <distributor idref="d1" />
            <price currency="PLN">37,49</price>
            <year_recorded>2015</year_recorded>
            <availability mp3="1" cd="0" dvd="1" />
            <playlist id="pl01" nazwa="Atramentowa">
                <track id="p01u01">Czerń i biel<time>3:27</time></track>
                <track id="p01u02">Czy o kimś ktoś<time>2:17</time></track>
                <track id="p01u03">Atramentowa rumba<time>5:16</time></track>
                <track id="p01u04">Do rycerzy, do szlachty, do mieszczan<time>3:22</time></track>
                <track id="p01u05">Drzwi odemknij<time>3:21</time></track>
                <track id="p01u06">Moje życie, twoje życie<time>3:19</time></track>
                <track id="p01u07">Obfitość<time>3:20</time></track>
                <track id="p01u08">Jego portret<time>3:15</time></track>
                <track id="p01u09">I znowu on<time>3:11</time></track>
                <track id="p01u10">Nie strasz<time>3:55</time></track>
                <track id="p01u11">Smuteczku mój<time>3:44</time></track>
                <track id="p01u12">Szeptem do mnie mów<time>3:33</time></track>
                <track id="p01u13">Wielka słota<time>3:11</time></track>
                <track id="p01u14">Wakacje z deszczem<time>2:59</time></track>
                <track id="p01u15">Pieśń cygańska<time>3:09</time></track> </playlist>
        </plate>

您可以将XSLT 2.0与Saxon 9一起使用,可以在.NET和http://saxon.sourceforge.net/的Java版本中使用。