Sharepoint日期操作和过滤

时间:2010-08-24 02:28:16

标签: sharepoint xslt date

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

<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 / m / y,numMonths是一个变量,用于保存表中所需的月数,startDay为15。

据我所知,向Date字段添加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中过滤列表,并考虑到第一个,但也许我做错了,因为我无法准确地生成我想要的东西 - 其中包括没有条目时的零特定月份,以及月份过滤器的&gt; = 15。我的方法几乎可以工作,这就是为什么它如此令人沮丧,但我会欢迎任何替代方案,特别是如果它们更简单和/或更快。 感谢

1 个答案:

答案 0 :(得分: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中不能有变量引用。

编辑:更好的密钥计算。