模板/XSLT和JavaScript 1.0两个值之间的差异不正常



我正在尝试计算指定的所有XML元素的日期和数字之间的差异,但它仅计算并获取XML中的最后一个元素。

例如:我有两个生日,但它只为所有计算收集了第二个生日。

主要目标是显示每个人的两个日期之间的差异。

以下是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

在循环中:

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

您在 all 的所有值上循环,但是每个循环覆盖 date 的上一个值。

您还应该用 var 来声明所有变量,例如

假设 all all2 中的元素与其各自集合中的位置相关,您可能需要以下内容:

// 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;
}

请注意,并非所有天数在使用日光节省的地方都有24小时的时间:

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

可能会返回涉及日光节省边界的不正确值。

最新更新