У меня реальная проблема при попытке отфильтровать список sharepoint по дате.Я хочу составить список месяцев / лет, в котором для каждой записи есть счет из списка, в который входят даты, которые больше или равны 15-му числу этого месяца или меньше 15-го числа следующего месяца.Я могу сделать это нормально для любого месяца, кроме декабря, где я хочу, чтобы подсчет прошел с 15 декабря 2009 года по 14 января 2010 года (например).Я действительно не понимаю, почему должна быть какая-то разница, поскольку я использую тот же метод.Если кто-то увидит ошибку в моем коде или лучший способ сделать это, я был бы очень признателен.
<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 - сегодняшняя дата в д / м /y, numMonths - это переменная для хранения количества месяцев, требуемого в таблице, а startDay равно 15.
Насколько я вижу, добавление 11 месяцев к полям Date работает, но извлекает годизменив его на число и вычтя 1, вот где проблема, кажется.Но я не могу заставить его работать, поэтому у меня совершенно не осталось простых идей.
XML-документ - это список Sharepoint, и я не знаю, как поделиться им как чистым XML.Единственная ссылка, которую я делаю на XML, это / dsQueryResponse / Rows [1] / Row, которая выбирает строки в списке Sharepoint и использует поле Date (@Date) для выполнения фильтра.Помогает ли это вообще?
Я использую Sharepoint 2007, и я начал с использования Sharepoint Designer для получения списка Sharepoint, вставив dataFormWebPart.Затем можно получить доступ к списку Sharepoint в XSLT с помощью xpath, / dsQueryResponse / Rows / Row, который ссылается на все строки в списке.(Я добавил [1] в мой код здесь для ссылки на конкретный список, так как у меня есть два источника данных списка.)
Я бы предпочел сначала отфильтровать список в Sharepoint, и сначала подумал, но, возможноя делаю что-то не так, так как я не могу заставить это произвести именно то, что я хочу - включая нули, когда нет записей для определенного месяца, а также> = 15 фильтра месяца.Мой метод почти работает, поэтому он очень расстраивает, но я бы приветствовал любые альтернативы, особенно если они проще и / или быстрее.Спасибо