我正在尝试使用xslt过滤列表,以便它只显示两个日期内的项目。但不知何故,结果是不正确的,只显示一个项目。我使用的陈述是:
<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)]"/>
我要做的是通过将他们的出生日期的日期和月份与今天的年份相关联来显示正在庆祝他们生日的员工并将其转换为数字。然后检查这个新日期是&gt; =今天的日期(也转换为数字)和&lt; =今天的日期+ 7天。
我是xslt的新手,并且一直试图解决这个问题超过一周。如果有人能帮助我,我真的很感激。
答案 0 :(得分:1)
我相信你可以使用XSLT扩展来更优雅地解决你的问题。
一些extension functions are provided by the ddwrt
namespace,但它们对日期算术都没有用。
由于我没有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>
上面经过充分测试和强大,它可能已经完成了你所需要的(*),你仍然可以将整个事情重新实现为正确的,基于.NET Framework的XSLT感知SharePoint扩展。
以下是有关如何针对SharePoint执行此操作的文章:http://blog.mastykarz.nl/extending-content-query-web-part-xslt-custom-functions/ - 它来自2009年,因此它可能不是100%适合当前版本的SharePoint,但它可能会让您失望。
(*)我建议您将所有日期保留为ISO 8601格式(YYYY-MM-DD
),以便CDate()
正确识别它们。 < / p>