2010-08-24 43 views
0

我遇到了尝试按日期过滤SharePoint列表的实际问题。我想列出一个月/年的列表,其中每个条目都有一个来自列表的计数,其中计数包括大于或等于该月的第15日或小于下一个月的第15日的日期。我可以在12月份以外的任何月份都做到这一点,我希望计数从2009年12月15日到2010年1月14日(例如)。我真的不明白为什么应该有什么区别,因为我使用相同的方法。如果任何人都可以在我的代码中看到错误,或者有更好的方法,我会非常感激。Sharepoint日期操作和过滤

<xsl:template name="generateTable"> 
     <xsl:param name="numMonths" /> 
     <xsl:param name="Rows" /> 
     <xsl:param name="dvt_Rows" /> 
     <xsl:param name="tday" select="$startDay" /> 
     <xsl:param name="tmonth" select="($startMonth + msxsl:node-set($numMonths)-1) mod 12 + 1" /> 
     <xsl:param name="tyear" select="$startYear + floor(($numMonths+msxsl:node-set($startMonth)-1) div 12)" /> 
     <xsl:variable name="date" select="concat($tday,'/',$tmonth,'/',$tyear)"/> 

     <tr> 
     <td> 
      <xsl:value-of select="ddwrt:FormatDateTime(string($date),3081,'MMMM yyyy')"/> 
     </td> 
     <td> 
     <xsl:choose> 
     <xsl:when test="$tmonth=12"> 
     <xsl:value-of select="count(/dsQueryResponse/Rows[1]/Row[(
            (ddwrt:FormatDateTime (string (@Date) , 3081, 'M yyyy'))=(ddwrt:FormatDateTime (string ($date) , 3081, 'M yyyy')) 
            and number(substring(ddwrt:FormatDateTime(string(@Date), 3081, 'dd'),1,2)) &gt;=$startDay)])+ 
            count(/dsQueryResponse/Rows[1]/Row[(
       concat(string(number(substring(ddwrt:FormatDateTime (string (@Date) , 3081, 'M yyyy'),1,2))+11),' ', 
       string(number(substring(ddwrt:FormatDateTime (string (@Date) , 3081, 'MM yyyy'),4))-1))=string(ddwrt:FormatDateTime (string ($date) , 3081, 'M yyyy')) 
       and number(substring(ddwrt:FormatDateTime(string(@Date), 3081, 'dd'),1,2)) &lt;$startDay)])"/>  
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="count(/dsQueryResponse/Rows[1]/Row[(
            (ddwrt:FormatDateTime (string (@Date) , 3081, 'M yyyy'))=(ddwrt:FormatDateTime (string ($date) , 3081, 'M yyyy')) 
            and number(substring(ddwrt:FormatDateTime(string(@Date), 3081, 'dd'),1,2)) &gt;=$startDay)])+ 
            count(/dsQueryResponse/Rows[1]/Row[(
       concat(string(number(substring(ddwrt:FormatDateTime (string (@Date) , 3081, 'MM yyyy'),1,2))-1), 
       substring(ddwrt:FormatDateTime (string (@Date) , 3081, 'MM yyyy'),3,6))=(ddwrt:FormatDateTime (string ($date) , 3081, 'M yyyy')) 
       and number(substring(ddwrt:FormatDateTime(string(@Date), 3081, 'dd'),1,2)) &lt;$startDay)])"/> 
     </xsl:otherwise> 
     </xsl:choose> 
     </td> 
     </tr> 

     <xsl:if test="msxsl:node-set($numMonths) &gt; 0"> 
      <xsl:call-template name="generateTable"> 
      <xsl:with-param name="numMonths" select="msxsl:node-set($numMonths)-1" /> 
      <xsl:with-param name="dvt_Rows"/> 
      <xsl:with-param name="Rows"/> 
     </xsl:call-template> 
     </xsl:if> 


</xsl:template> 

在代码中,tday,tmonth和tyear是在d /月/今天的日期,NUMMONTHS是一个变量来保存在表中所要求的月数,并朝九特派为15

据我所知,向日期字段添加11个月的工作,但提取年份,将其更改为一个数字并减去1,就是问题出现的地方。但我无法实现它,所以我完全用完了简单的想法。

XML文档是Sharepoint列表,我不知道如何将其作为纯XML共享。我对XML的唯一参考是/ dsQueryResponse/Rows [1]/Row,它选择Sharepoint列表中的行,并使用Date字段(@Date)执行过滤器。这有帮助吗?

我使用的是Sharepoint 2007,我通过使用Sharepoint Designer通过插入dataFormWebPart来获取Sharepoint列表来开始。然后可以使用引用列表中所有行的xpath,/ dsQueryResponse/Rows/Row来访问XSLT中的Sharepoint列表。 (我在我的代码中添加了[1]来引用特定的列表,因为我有两个列表数据源)。

我宁愿首先在Sharepoint中过滤列表,并认为首先,但也许我做错了什么,因为我无法得到正是我想要的东西 - 其中包括零时没有条目对于特定的月份,以及月份过滤器的> = 15。我的方法几乎可行,这就是为什么它是如此令人沮丧,但我会欢迎任何替代品,尤其是如果它们更简单和/或更快。 感谢

+0

您能不能请我们提供XML文档(尽可能最小化,以便说明问题)?我怀疑可能有更简单的解决方案,但需要使用XML文档。 – 2010-08-24 03:37:10

+0

几个问题..什么版本的SharePoint?你如何从SharePoint列表中获取数据?另外,为什么使用XSLT过滤SharePoint列表?您不想查询列表(以过滤行),然后使用XSLT转换结果吗? – 2010-08-24 14:03:27

回答

0

作为例子,这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kDateByYearAndMonth" match="date" 
      use="translate(substring(.,1,7),'-','') - 
        (15 > substring(.,9,2)) * (1 + (substring(.,6,2)='01') * 88)"/> 
    <xsl:template match="root"> 
     <result> 
      <xsl:apply-templates select="date[count(. | 
               key('kDateByYearAndMonth', 
                translate(substring(.,1,7),'-','') - 
                (15 > substring(.,9,2)) * 
                (1 + (substring(.,6,2)='01') * 88) 
                )[1] 
               ) = 1]"/> 
     </result> 
    </xsl:template> 
    <xsl:template match="date"> 
     <xsl:variable name="vKey" select="translate(substring(.,1,7),'-','') - 
        (15 > substring(.,9,2)) * (1 + (substring(.,6,2)='01') * 88)"/> 
     <xsl:variable name="vDates" select="key('kDateByYearAndMonth',$vKey)"/> 
     <group year="{substring($vKey,1,4)}" month="{substring($vKey,5,2)}" 
       count="{count($vDates)}"> 
      <xsl:copy-of select="$vDates"/> 
     </group> 
    </xsl:template> 
</xsl:stylesheet> 

有了这个输入:

<root> 
<date>2001-01-01T00:15:00</date> 
<date>2001-01-02T00:15:00</date> 
<date>2001-02-03T00:15:00</date> 
<date>2001-02-04T00:15:00</date> 
<date>2002-03-05T00:15:00</date> 
<date>2002-03-06T00:15:00</date> 
<date>2002-04-07T00:15:00</date> 
<date>2002-04-08T00:15:00</date> 
<date>2003-05-09T00:15:00</date> 
<date>2003-05-10T00:15:00</date> 
<date>2003-06-11T00:15:00</date> 
<date>2003-06-12T00:15:00</date> 
<date>2004-07-13T00:15:00</date> 
<date>2004-07-14T00:15:00</date> 
<date>2004-08-15T00:15:00</date> 
<date>2004-08-16T00:15:00</date> 
<date>2005-09-17T00:15:00</date> 
<date>2005-09-18T00:15:00</date> 
<date>2005-10-19T00:15:00</date> 
<date>2005-10-20T00:15:00</date> 
<date>2006-11-21T00:15:00</date> 
<date>2006-11-22T00:15:00</date> 
<date>2006-12-23T00:15:00</date> 
<date>2006-12-24T00:15:00</date> 
<date>2007-01-25T00:15:00</date> 
<date>2007-01-26T00:15:00</date> 
<date>2007-02-27T00:15:00</date> 
<date>2007-02-28T00:15:00</date> 
<date>2008-03-29T00:15:00</date> 
<date>2008-03-30T00:15:00</date> 
<date>2008-04-31T00:15:00</date> 
</root> 

输出:

<result> 
    <group year="2000" month="12" count="2"> 
     <date>2001-01-01T00:15:00</date> 
     <date>2001-01-02T00:15:00</date> 
    </group> 
    <group year="2001" month="1" count="2"> 
     <date>2001-02-03T00:15:00</date> 
     <date>2001-02-04T00:15:00</date> 
    </group> 
    <group year="2002" month="2" count="2"> 
     <date>2002-03-05T00:15:00</date> 
     <date>2002-03-06T00:15:00</date> 
    </group> 
    <group year="2002" month="3" count="2"> 
     <date>2002-04-07T00:15:00</date> 
     <date>2002-04-08T00:15:00</date> 
    </group> 
    <group year="2003" month="4" count="2"> 
     <date>2003-05-09T00:15:00</date> 
     <date>2003-05-10T00:15:00</date> 
    </group> 
    <group year="2003" month="5" count="2"> 
     <date>2003-06-11T00:15:00</date> 
     <date>2003-06-12T00:15:00</date> 
    </group> 
    <group year="2004" month="6" count="2"> 
     <date>2004-07-13T00:15:00</date> 
     <date>2004-07-14T00:15:00</date> 
    </group> 
    <group year="2004" month="8" count="2"> 
     <date>2004-08-15T00:15:00</date> 
     <date>2004-08-16T00:15:00</date> 
    </group> 
    <group year="2005" month="9" count="2"> 
     <date>2005-09-17T00:15:00</date> 
     <date>2005-09-18T00:15:00</date> 
    </group> 
    <group year="2005" month="10" count="2"> 
     <date>2005-10-19T00:15:00</date> 
     <date>2005-10-20T00:15:00</date> 
    </group> 
    <group year="2006" month="11" count="2"> 
     <date>2006-11-21T00:15:00</date> 
     <date>2006-11-22T00:15:00</date> 
    </group> 
    <group year="2006" month="12" count="2"> 
     <date>2006-12-23T00:15:00</date> 
     <date>2006-12-24T00:15:00</date> 
    </group> 
    <group year="2007" month="1" count="2"> 
     <date>2007-01-25T00:15:00</date> 
     <date>2007-01-26T00:15:00</date> 
    </group> 
    <group year="2007" month="2" count="2"> 
     <date>2007-02-27T00:15:00</date> 
     <date>2007-02-28T00:15:00</date> 
    </group> 
    <group year="2008" month="3" count="2"> 
     <date>2008-03-29T00:15:00</date> 
     <date>2008-03-30T00:15:00</date> 
    </group> 
    <group year="2008" month="4" count="1"> 
     <date>2008-04-31T00:15:00</date> 
    </group> 
</result> 

注意:这个月的开始日是“硬编码“,因为不能有变量引用在xsl:key/@use

Editt:更好的关键计算。

+0

谢谢。我用你的只有substring的函数的想法来取代我的冗长的字符串(数字(substring(etc)))函数,似乎工作。不知道为什么会这样。 – AliceA 2010-08-25 04:59:18