使用 XSLT 比较日期周期
我对 XSLT 有一些经验,但现在我遇到了一个问题: 我需要检查开始日期和结束日期之间的时间段是否完全覆盖其他时间段。
这是 xml 的一部分:
<Parent ID="1">
<StartDate>20050101</StartDate>
<EndDate>20060131</EndDate>
<Child ID="1">
<StartDate>20050101</StartDate>
<EndDate>20081231</EndDate>
</Child>
</Parent>
<Parent ID="2">
<StartDate>20060201</StartDate>
<EndDate>20071231</EndDate>
<Child ID="1">
<StartDate>20050101</StartDate>
<EndDate>20081231</EndDate>
</Child>
</Parent>
<Parent ID="3">
<StartDate>20080101</StartDate>
<EndDate>20081231<EndDate>
<Child ID="1">
<StartDate>20050101</StartDate>
<EndDate>20081231</EndDate>
</Child>
</Parent>
因此,我需要检查 XSLT 中父项的开始和结束之间的时间段是否完全被子项的开始和结束之间的时间段覆盖,并将父项和子项 ID 写入 xml,以防止失败。
有人可以告诉我如何在 XSLT 中管理这个......?
我可以完全控制 XML 的结构,因此当使用其他 XML 结构(具有相同的数据)更容易时,我可以更改它。
多谢!
I have some experience with XSLT but now i've got myself a problem:
I need to check if a period between a begin- and enddate completely covers an other period.
Here's a part of the xml:
<Parent ID="1">
<StartDate>20050101</StartDate>
<EndDate>20060131</EndDate>
<Child ID="1">
<StartDate>20050101</StartDate>
<EndDate>20081231</EndDate>
</Child>
</Parent>
<Parent ID="2">
<StartDate>20060201</StartDate>
<EndDate>20071231</EndDate>
<Child ID="1">
<StartDate>20050101</StartDate>
<EndDate>20081231</EndDate>
</Child>
</Parent>
<Parent ID="3">
<StartDate>20080101</StartDate>
<EndDate>20081231<EndDate>
<Child ID="1">
<StartDate>20050101</StartDate>
<EndDate>20081231</EndDate>
</Child>
</Parent>
So i need to check if the period between start and end of the Parent is fully covered by the period between start and end of the Child in XSLT and write the Parent and Child ID's to xml for fails.
Can someone give me a head start how to manage this in XSLT...?
I have full control over the structure of the XML so when it's easier with an other XML structure (with the same data) i can change it.
Thanks a lot!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
下面是一个直接在 xslt 2.0 中执行此操作的示例,并且应该适用于大多数日期分隔符:
Here is an example to do it directly in xslt 2.0 and should work with most date delimeters:
使用简单的字符串比较这很容易,因为您的日期格式是大尾数。下面是我为了测试它而编写的一个快速 XSLT 文档:
显然,您需要自己进行检查,以确保父级和子级的
StartDate
早于EndDate
。Using simple string comparison this is easy, because your date format is big-endian. Here's a quick XSLT document I wrote up to test it out:
Obviously you'll need your own checks to make sure that
StartDate
is beforeEndDate
for both parent and child.number(Child/StartDate) <= number(Parent/StartDate) 和 number(Child/EndDate) >= number(Parent/EndDate)
有什么问题吗?What's wrong with
number(Child/StartDate) <= number(Parent/StartDate) and number(Child/EndDate) >= number(Parent/EndDate)
?这并不是一个完整的解决方案,但您可能想查看用于日期操作的 EXSLT 扩展,此处。
不过,我会考虑使用 XSLT 扩展函数 创建几个="http://joda-time.sourceforge.net/api-release/org/joda/time/Interval.html" rel="nofollow noreferrer">Joda 时间的 Interval 抽象。可能比直接从 XSLT 尝试更容易、更快。
This is not going to a complete solution, but you may want to check out the EXSLT extensions for date manipulation, here.
I would however consider creating a couple of XSLT extension functions, using Joda time's Interval abstractions. Probably way easier and faster than trying to do it from XSLT directly.