2016-06-16 4 views
1

私はこのようなXMLファイルを持っています。 リスト内のすべてのアイテムにdateCreatedがあります。 使用されたアイテムにはdateLastUsedがあります。 使用されていない項目には、dateLastUsedというノードがありません。XSL if-clauseここで、変数はより大きいか存在しません。

それだけ 1である項目が含まれているので、私はそれ以上の年齢よりも5年と 2A)、リストをフィルタリングしたい
<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="stripped.xsl"?> 
<report> 
<dateCreated>2016-05-20T12:16:11</dateCreated> 
<catalog> 
<description>Older than five, never used</description> 
<call> 
    <item> 
    <itemID>30580004885005</itemID> 
    <dateCreated>2000-02-11</dateCreated> 
    </item> 
</call> 
</catalog> 
<catalog> 
<description>Older than five, but used threee years ago</description> 
<call> 
    <item> 
    <dateLastUsed>2013-10-25</dateLastUsed> 
    <itemID>30580005522235</itemID> 
    <dateCreated>1996-06-20</dateCreated> 
    </item> 
</call> 
</catalog> 
<catalog> 
<description>Older than five, used more than five years ago</description> 
<call> 
    <item> 
    <dateLastUsed>2010-04-12</dateLastUsed> 
    <itemID>30580004882085</itemID> 
    <dateCreated>2000-02-01</dateCreated> 
    </item> 
</call> 
</catalog> 
<catalog> 
<description>Older than five, but used this year</description> 
<call> 
    <item> 
    <dateLastUsed>2016-05-18</dateLastUsed> 
    <itemID>30580004899105</itemID> 
    <dateCreated>2000-03-29</dateCreated> 
    </item> 
</call> 
</catalog> 
<catalog> 
<description>Younger than five, used less than five years ago</description> 
<call> 
    <item> 
    <dateLastUsed>2016-04-12</dateLastUsed> 
    <itemID>30580005334920</itemID> 
    <dateCreated>2015-04-25</dateCreated> 
    </item> 
</call> 
</catalog> 
<catalog> 
<description>Younger than five, never used</description> 
<call> 
    <item> 
    <itemID>30580005334938</itemID> 
    <dateCreated>2014-04-25</dateCreated> 
    </item> 
</call> 
</catalog> 
</report> 

)が五年以上前に使用したり、 2b)は、すべての

で使用されることはありません1は簡単にif節で解決されました 2aは2番目のif節でも簡単に解決できましたが、2bを解決する方法は?

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:param name="fiveYears" select="1825" /> 
<xsl:template match="/"> 
    <catalog> 
     <xsl:for-each select="report/catalog"> 

       <xsl:variable name="daysSinceCreated"> 
        <xsl:call-template name="date-difference"> 
         <xsl:with-param name="date1" select="call/item/dateCreated" /> 
         <xsl:with-param name="date2" select="//report/dateCreated" /> 
        </xsl:call-template> 
       </xsl:variable> 

       <xsl:variable name="daysSinceUsed"> 
        <xsl:call-template name="date-difference"> 
         <xsl:with-param name="date1" select="call/item/dateLastUsed" /> 
         <xsl:with-param name="date2" select="//report/dateCreated" /> 
        </xsl:call-template> 
       </xsl:variable> 

       <xsl:if test="$daysSinceCreated > $fiveYears"> 

        <xsl:if test="$daysSinceUsed > $fiveYears"> 

         <itemline> 
          <description><xsl:value-of select="description"/></description> 
          <dateCreated><xsl:value-of select="call/item/dateCreated"/></dateCreated> 
          <daysSinceCreated><xsl:value-of select="$daysSinceCreated"/></daysSinceCreated> 
          <dateLastUsed><xsl:value-of select="call/item/dateLastUsed"/></dateLastUsed> 
          <daysSinceUsed><xsl:value-of select="$daysSinceUsed"/></daysSinceUsed> 
         </itemline> 

        </xsl:if> 

       </xsl:if> 
     </xsl:for-each> 
    </catalog> 
</xsl:template> 

<xsl:template name="date-difference"> 
    <xsl:param name="date1"/> 
    <xsl:param name="date2"/> 
    <xsl:param name="JDN1"> 
     <xsl:call-template name="JDN"> 
      <xsl:with-param name="date" select="$date1" /> 
     </xsl:call-template> 
    </xsl:param> 
    <xsl:param name="JDN2"> 
     <xsl:call-template name="JDN"> 
      <xsl:with-param name="date" select="$date2" /> 
     </xsl:call-template> 
    </xsl:param> 
    <xsl:value-of select="$JDN2 - $JDN1"/> 
</xsl:template> 

<xsl:template name="JDN"> 
    <xsl:param name="date"/> 
    <xsl:param name="year" select="substring($date, 1, 4)"/> 
    <xsl:param name="month" select="substring($date, 6, 2)"/> 
    <xsl:param name="day" select="substring($date, 9, 2)"/> 
    <xsl:param name="a" select="floor((14 - $month) div 12)"/> 
    <xsl:param name="y" select="$year + 4800 - $a"/> 
    <xsl:param name="m" select="$month + 12*$a - 3"/> 
    <xsl:value-of select="$day + floor((153*$m + 2) div 5) + 365*$y + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" /> 
</xsl:template> 

</xsl:stylesheet> 
+0

「5年以上*」は、「/ report/dateCreated」に対して「現在の」日付として計算されることを意味していますか? –

+0

はい - 通常の使用では、 "今日"と同じです。 –

答えて

1

私はこのようなあなたのxsl:if文...あなたはまた、使用することができ

<xsl:if test="($daysSinceCreated > $fiveYears and $daysSinceUsed > $fiveYears) 
    or not(string(call/item/dateLastUsed))"> 
    <itemline> 
     <description><xsl:value-of select="description"/></description> 
     <dateCreated><xsl:value-of select="call/item/dateCreated"/></dateCreated> 
     <daysSinceCreated><xsl:value-of select="$daysSinceCreated"/></daysSinceCreated> 
     <dateLastUsed><xsl:value-of select="call/item/dateLastUsed"/></dateLastUsed> 
     <daysSinceUsed><xsl:value-of select="$daysSinceUsed"/></daysSinceUsed> 
    </itemline> 
</xsl:if> 

組み合わせることでしょう:あなたはまだ場合でも、それ$daysSinceUsedを計算しようとしているので、代わりにstring()の結果を確認するのor $daysSinceUsed='NaN'を使用されていない。

関連する問題