Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个日期之间添加xslt筛选_Xslt_Filtering_Sharepoint Designer - Fatal编程技术网

在两个日期之间添加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

我正在尝试使用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)]"/>


我想做的是显示本周庆祝生日的员工,将他们生日的日期和月份与今天的年份连接起来,并将其转换为数字。然后检查这个新日期是否为>=今天的日期(也转换为数字),我相信您可以使用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是的,我知道。我正试图将生日改为今年,这样它每年都会改变。我不确定是否有其他方法可以做到这一点。我所做的就是抓取今天的年份,抓取员工生日的日期和月份,然后加入他们。为了比较日期,我必须将日期转换为数字。如果有更好的方法,请告诉我。我真的很感激。