如何解决根据日期使用XSL从XML过滤用户?
我有一个例程,其中我根据XML文件中的数据为用户分配成员资格。但是,消息源最近将时间范围引入了成员资格,现在我需要根据活动时间范围进行过滤。听起来很简单,对吧?
但是:
- 某些用户没有时间表。它们一定不能被过滤。
- 某些用户有2个时间范围,其中一个时间,两个时间都不活跃。必须选择一个或两个时间范围都处于活动状态的事件
- 某些用户的时间范围是开始但没有结束。如果当前日期晚于开始日期,则必须选择它们。
这是一个例子:
<member>
<sourcedid>
<id>person_0f2f2d24-c19a-42d8-98bd-2f4147d693a60</id>
</sourcedid>
<idtype>1</idtype>
<role roletype="01">
<status>0</status>
<datetime>2020-08-01</datetime>
<timeframe>
<begin restrict="0">2020-08-01</begin>
<end restrict="0">2020-08-21</end>
<adminperiod>H2020/V2021</adminperiod>
</timeframe>
</role>
<role roletype="01">
<status>1</status>
<datetime>2020-08-22</datetime>
<timeframe>
<begin restrict="0">2020-08-22</begin>
<end restrict="0">2021-07-31</end>
<adminperiod>H2020/V2021</adminperiod>
</timeframe>
</role>
</member>
我们尝试过此方法,但它仅适用于具有1个时间范围的对象:
<xsl:for-each select="$sections">
<xsl:variable name="group" select="."/>
<xsl:variable name="memberships" select="key('membership',$group/sourcedid/id,$root)"/>
<xsl:for-each select="$memberships">
<xsl:variable name="membership" select="."/>
<xsl:for-each select="$membership/member[role[@roletype eq '01']][my:filterMember(.)]">
<xsl:value-of select="$membership/sourcedid/id"/><xsl:value-of select="$delimiter"/>
<xsl:value-of select="sourcedid/id"/><xsl:value-of select="$break"/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
<xsl:function name="my:filterMember">
<xsl:param name="member"/>
<xsl:variable name="timeframes" select="$member/role/timeframe"/>
<xsl:choose>
<xsl:when test="$timeframes[begin/xs:date(.) gt current-date() or end/xs:date(.) lt current-date()]">
<xsl:sequence select="false()"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="true()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
有什么建议吗?
解决方法
您不能简单地做:
or not(role/timeframe)
这应该实现您的2d和3d条件。我不了解您的第一个条件:可以双向阅读。如果“未过滤”表示“包含在选择中”,则只需添加LoginBloc
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。