Sharepoint дата манипулирование и фильтрация - PullRequest
0 голосов
/ 24 августа 2010

У меня реальная проблема при попытке отфильтровать список 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)) &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 - сегодняшняя дата в д / м /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 фильтра месяца.Мой метод почти работает, поэтому он очень расстраивает, но я бы приветствовал любые альтернативы, особенно если они проще и / или быстрее.Спасибо

1 Ответ

0 голосов
/ 24 августа 2010

Как пример, эта таблица стилей:

<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.

1015 * Editt : лучший расчет ключа не может быть переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...