我在尝试按日期过滤共享点列表时遇到了实际问题。我想生成一个月/年的列表,其中每个条目都有一个列表中的计数,其中计数包括大于或等于该月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)) >=$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)) <$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)) >=$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)) <$startDay)])"/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
<xsl:if test="msxsl:node-set($numMonths) > 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。我的方法几乎可以工作,这就是为什么它如此令人沮丧,但我会欢迎任何替代方案,特别是如果它们更简单和/或更快。 感谢
答案 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
中不能有变量引用。
编辑:更好的密钥计算。