2017-09-08 2 views
0

指定されたすべてのxml要素の日付と数値の差を計算しようとしていますが、xml内の最後の要素のみを計算して取得します。Template/XSLTとjavaScript 1.0 2つの値の差が正しく動作しない

例:私は2つの誕生日を持っていますが、すべての計算で2番目の誕生日だけを収集します。

主な目標は、すべての人の2日の日数の差を表示することです。以下

はXSLTコードおよびXMLコードである:

XSLT:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
     <head> 
      <title>Sample JS</title> 
      <script> 
       window.onload = function() { 
        var all = document.querySelectorAll('.date'); 
        var all2 = document.querySelectorAll('.date2'); 

        for(element of all) { 
         date = new Date(element.innerHTML); 


        } 
        for(element of all2) { 
         date2 = new Date(element.innerHTML); 

         difference = Math.abs(date2.getTime() - date.getTime()); 
         days = Math.ceil(difference/(1000 * 3600 * 24)); 
         element.innerHTML = days; 
        } 

        var numb = document.querySelectorAll('.num1'); 
        var numb2 = document.querySelectorAll('.num2'); 

        for(element of numb) { 
         num1 = element.innerHTML; 
        } 
        for(element of numb2) { 


         num2 = element.innerHTML; 

         difference = num2 - num1; 
         element.innerHTML = difference; 
        } 
       } 

      </script> 
     </head> 
     <body> 
      <xsl:apply-templates select="people/person" /> 
     </body> 
    </html> 
</xsl:template> 



<xsl:template match="person"> 
    <p>Birthday: <span class="date"><xsl:value-of select="dob/text()"/></span></p> 
    <p>Death day: <xsl:value-of select="dod/text()"/></p> 
    <p>Difference: <span class="date2"><xsl:value-of select="dod/text()"/></span></p> 
    <p> 
     <xsl:value-of select="num2/text()"/> - 
     <span class="num1"><xsl:value-of select="num/text()"/></span> = 
     <span class="num2"><xsl:value-of select="num2/text()"/></span> 
    </p> 
</xsl:template> 
</xsl:stylesheet> 

XML

<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="js-example.xsl"?> 
<people> 
    <person> 
     <name>John</name> 
     <dob>2017-09-01</dob> 
     <dod>2017-09-08</dod> 
     <num>1</num> 
     <num2>30</num2> 
    </person> 
    <person> 
     <name>Sarah</name> 
     <dob>2017-09-10</dob> 
     <dod>2017-09-07</dod> 
     <num>10</num> 
     <num2>20</num2> 
    </person> 
</people> 

出力:ループで

Birthday: 2017-09-01 

Death day: 2017-09-08 

Difference: 2 

30 - 1 = 20 

Birthday: 2017-09-10 

Death day: 2017-09-07 

Difference: 3 

20 - 10 = 10 

答えて

0

for(element of all) { 
    date = new Date(element.innerHTML); 
} 

あなたすべてのすべての値をループが、各ループは日付の以前の値を上書きします。

また、それ以外の場合は、コードが実行されるときになって、VARのようにすべての変数を宣言する必要があります。ないすべての日は昼光の場所で24時間の長さである

// Declare all variables 
var all = document.querySelectorAll('.date'); 
var all2 = document.querySelectorAll('.date2'); 
var date1, date2, difference, days; 

for (var i=0, iLen=all.length; i<iLen; i++) { 
    date1 = new Date(all[i].innerHTML); 
    date2 = new Date(all2[i].innerHTML); 

    difference = Math.abs(date2 - date1); 
    days = Math.ceil(difference/(1000 * 3600 * 24)); 
    // This will replace the date in all2 
    all2[i].innerHTML = days; 
} 

注:すべてのとALL2がそれぞれのコレクション内の位置によって相関される内の要素を想定し

は、おそらくのようなものが必要

days = Math.ceil(difference/(1000 * 3600 * 24)); 

は、夏時間の境界が含まれている間違った値を返すことがあります。

+0

偉大な説明、ありがとう! – mmm

関連する問題