在两个日期之间添加xslt过滤

时间:2014-03-03 07:04:15

标签: 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(string(@DateOfBirth), 1033, 'MM'),0,3),substring(ddwrt:FormatDateTime(string(@DateOfBirth),1033,'dd'),1,3))))
&gt;= (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))))
&lt;= (number(translate(ddwrt:FormatDateTime(string(ddwrt:Today()),1033,'yyyyMMdd'),'',''))+7)]"/>

我要做的是通过将他们的出生日期的日期和月份与今天的年份相关联来显示正在庆祝他们生日的员工并将其转换为数字。然后检查这个新日期是&gt; =今天的日期(也转换为数字)和&lt; =今天的日期+ 7天。

我是xslt的新手,并且一直试图解决这个问题超过一周。如果有人能帮助我,我真的很感激。

1 个答案:

答案 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>