在两个日期之间添加xslt筛选
我正在尝试使用xslt筛选列表,以便它只显示两个日期内的项目。但不知何故,如果只显示一个项目,结果是不正确的。我使用的说法是:在两个日期之间添加xslt筛选,xslt,filtering,sharepoint-designer,Xslt,Filtering,Sharepoint Designer,我正在尝试使用xslt筛选列表,以便它只显示两个日期内的项目。但不知何故,如果只显示一个项目,结果是不正确的。我使用的说法是: <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[(number(concat(substring(ddwrt:FormatDateTime(string(ddwrt:Today()), 1033, 'yyyy'),0,5),substring(ddwrt:FormatDateTime(s
<xsl:variable name="Rows"
select="/dsQueryResponse/Rows/Row[(number(concat(substring(ddwrt:FormatDateTime(string(ddwrt:Today()), 1033, 'yyyy'),0,5),substring(ddwrt:FormatDateTime(string(@DateOfBirth), 1033, 'MM'),0,3),substring(ddwrt:FormatDateTime(string(@DateOfBirth),1033,'dd'),1,3))))
>= (number(translate(ddwrt:FormatDateTime(string(ddwrt:Today()),1033,'yyyyMMdd'),' ','')))
and(number(concat(substring(ddwrt:FormatDateTime(string(ddwrt:Today()), 1033, 'yyyy'),0,5),substring(ddwrt:FormatDateTime(string(@DateOfBirth), 1033, 'MM'),0,3),substring(ddwrt:FormatDateTime(string(@DateOfBirth),1033,'dd'),1,3))))
<= (number(translate(ddwrt:FormatDateTime(string(ddwrt:Today()),1033,'yyyyMMdd'),'',''))+7)]"/>
我想做的是显示本周庆祝生日的员工,将他们生日的日期和月份与今天的年份连接起来,并将其转换为数字。然后检查这个新日期是否为>=今天的日期(也转换为数字),我相信您可以使用XSLT扩展更优雅地解决问题 有一些,但没有一个对日期算术非常有用 由于我没有SharePoint可用于测试任何代码,因此我将显示一个基于VBScript的脚本扩展。下面是一个
IsAnniversary()
函数以及一些支持代码
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:udf="http://tempuri.org/udf"
exclude-result-prefixes="ddwrt msxsl udf"
>
<xsl:template match="/">
<xsl:for-each select="
/dsQueryResponse/Rows/Row[udf:IsAnniversary(@DateOfBirth, 7)]
">
<xsl:value-of select="@DateOfBirth" />
</xsl:for-each>
</xsl:template>
<msxsl:script language="VBScript" implements-prefix="udf">
<![CDATA[
Option Explicit
Function FirstValue(Input)
If IsObject(Input) Then ' it's an IXMLDOMNodeList
If Input.length > 0 Then FirstValue = Input.item(0).text Else FirstValue = Empty
Else
FirstValue = Input
End If
End Function
Function ParseDate(Input)
Input = FirstValue(Input)
Input = Split(Input & "T", "T")(0) ' handle ISO 8601 datetimes
If IsDate(Input) Then ParseDate = CDate(Input) Else ParseDate = Empty
End Function
Function ParseInt(Input)
Input = FirstValue(Input)
If IsNumeric(Input) Then ParseInt = CInt(Input) Else ParseInt = Empty
End Function
Function IsAnniversary(Input, WithinDays)
Dim TheDate, Diff
IsAnniversary = False
TheDate = ParseDate(Input)
WithinDays = ParseInt(WithinDays)
If Not (IsEmpty(TheDate) Or IsEmpty(WithinDays)) Then
TheDate = DateAdd("yyyy", Year(Now()) - Year(TheDate), TheDate)
Diff = DateDiff("d", Now(), TheDate)
If WithinDays >= 0 Then
IsAnniversary = Diff >= 0 And Diff <= WithinDays
Else
IsAnniversary = Diff <= 0 And Diff >= WithinDays
End If
End If
End Function
]]>
</msxsl:script>
</xsl:stylesheet>
0然后FirstValue=输入。项(0)。文本Else FirstValue=空
其他的
第一个值=输入
如果结束
端函数
函数解析日期(输入)
输入=第一个值(输入)
输入=拆分(输入和“T”,“T”)(0)句柄ISO 8601日期时间
如果是IsDate(输入),则ParseDate=CDate(输入),否则ParseDate=Empty
端函数
函数ParseInt(输入)
输入=第一个值(输入)
如果是数字(输入),则ParseInt=CInt(输入),否则ParseInt=Empty
端函数
函数是一个通用函数(输入,以天为单位)
模糊的,模糊的
IsAnniversary=错误
TheDate=ParseDate(输入)
WithinDays=ParseInt(WithinDays)
如果不是(I空(日期)或I空(不超过天)),则
日期=日期添加(“yyyy”,年(现在())-年(日期),日期)
Diff=DateDiff(“d”,Now(),TheDate)
如果WithinDays>=0,则
IsAnyVersary=Diff>=0和Diff
上面的内容经过了很好的测试,而且非常健壮,它可能已经满足了您的需要(*),但您仍然可以将整个内容重新实现为一个基于.NET Framework的适当的、支持XSLT的SharePoint扩展
这里有一篇关于如何在SharePoint上做到这一点的文章:-它是从2009年开始的,所以它可能不是100%适合当前版本的SharePoint,但它可能会让您开始
(*)我建议您将所有日期保留为ISO 8601格式(
YYYY-MM-DD
),以便CDate()
正确识别它们。如果您将输入XML和预期输出与您迄今为止尝试的内容一起发布,我们将提供更多帮助。您可能会发现这很有趣:这:@Tomalak是的,我知道。我正试图将生日改为今年,这样它每年都会改变。我不确定是否有其他方法可以做到这一点。我所做的就是抓取今天的年份,抓取员工生日的日期和月份,然后加入他们。为了比较日期,我必须将日期转换为数字。如果有更好的方法,请告诉我。我真的很感激。