我正在尝试计算指定的所有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));
可能会返回涉及日光节省边界的不正确值。