Таблица отсортированных и сгруппированных данных в XForms

Я использую средство запуска форм Orbeon для выполнения некоторых документов XForms. Я хотел бы управлять списком записей, чтобы отслеживать время. Я использую xforms: repeat для создания таблицы с моими данными и xforms: trigger с xforms: insert для вставки новых записей. Теперь я хотел бы отсортировать записи по дате и сгруппировать записи по месяцам, как показано на следующем рисунке:

Пример сгруппированной таблицы

Для каждого месяца я хотел бы подсчитать общее количество часов. Может ли кто-нибудь подсказать, как создать это с помощью XForms / Orbeon, есть ли рабочий пример, который делает что-то подобное?

Спасибо!


person lacco    schedule 09.05.2011    source источник


Ответы (1)


Вот пример, который выполняет аналогичную группировку для вывода следующего:

  • May 2011
    • 2011-05-10: Homer
    • 2011-05-09: Лиза
  • April 2011
    • 2011-04-07: Bart
    • 2011-04-05: Барт
    • 2011-04-02: Лиза

Это не совсем то, что показано на скриншоте, но оно должно дать вам достаточно хорошее представление о том, как выполнить эту группировку.

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
      xmlns:xforms="http://www.w3.org/2002/xforms"
      xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:fr="http://orbeon.org/oxf/xml/form-runner">
    <xhtml:head>
        <xhtml:title>Timesheet</xhtml:title>
        <xforms:model>
            <xforms:instance>
                <instance>
                    <entry>
                        <start>2011-05-10</start>
                        <person>Homer</person>
                    </entry>
                    <entry>
                        <start>2011-05-09</start>
                        <person>Lisa</person>
                    </entry>
                    <entry>
                        <start>2011-04-07</start>
                        <person>Bart</person>
                    </entry>
                    <entry>
                        <start>2011-04-05</start>
                        <person>Bart</person>
                    </entry>
                    <entry>
                        <start>2011-04-02</start>
                        <person>Lisa</person>
                    </entry>
                </instance>
            </xforms:instance>
        </xforms:model>
        <xhtml:style type="text/css">
            .xforms-repeat-selected-item-1, .xforms-repeat-selected-item-2 { background: transparent }
        </xhtml:style>
    </xhtml:head>
    <xhtml:body>
        <xxforms:variable name="entries" select="entry"/>
        <xxforms:variable name="months" select="distinct-values($entries/start/substring(., 1, 7))"/>
        <xhtml:ul>
            <xforms:repeat nodeset="$months">
                <xxforms:variable name="current-month" select="."/>
                <xhtml:li>
                    <xforms:output value="format-date(xs:date(concat(., '-01')), '[MNn] [Y]')"/>
                    <xhtml:ul>
                        <xforms:repeat nodeset="$entries[substring(start, 1, 7) = $current-month]">
                            <xhtml:li>
                                <xforms:output ref="start"/>:
                                <xforms:output ref="person"/>
                            </xhtml:li>
                        </xforms:repeat>
                    </xhtml:ul>
                </xhtml:li>
            </xforms:repeat>
        </xhtml:ul>
    </xhtml:body>
</xhtml:html>
person avernet    schedule 11.05.2011
comment
Спасибо за ответ, ваш пример сделал меня большим шагом вперед! У меня есть еще два вопроса: (1) В моем примере у меня есть время начала и окончания (xs: time). Я хотел бы рассчитать количество часов между (xs:time(end) - xs:time(start)) в xforms:output, как мне это сделать? Вычисления времени в xforms / xpath кажутся довольно странными ... (2) Можно ли отсортировать все $entries? Пользователи могут вводить даты в произвольном порядке, поэтому может случиться, что май 2011 г. будет после июня 2011 г. - person lacco; 12.05.2011
comment
Если у вас меньше 1 месяца между двумя dateTime, вы можете использовать следующее, чтобы вычислить количество часов между ними. Обратите внимание, что я начинаю выражение здесь с объявления двух переменных $t1 и $t2; обычно вы обращаетесь к узлам, содержащим эту информацию. for $t1 in '2011-05-12T13:24:20.929-07:00', $t2 in '2011-05-13T17:56:20.929-07:00' return for $d in xs:dateTime($t2) - xs:dateTime($t1) return days-from-duration($d)*24 + hours-from-duration($d) - person avernet; 14.05.2011