Группировка списка с XSLT 1.0 в каждый день на основе поля даты в списке - PullRequest
0 голосов
/ 02 июня 2018

В качестве примера приведен приведенный ниже XML-код, и я хочу получить такой результат:

20.06.2016
    08:30-09:00   TEST_PHX_88
    09:30-10:00   TEST_PHX_99
21.06.2016
    10:30-11:30   TEST_PHX_66
23.06.2018
    09:30-10:00   TEST_PHX_77
    09:30-10:30   TEST_PHX_55

Таким образом, список должен быть сгруппирован по дням и в течение дня, отсортированного по времени в пределах даты

Может ли кто-нибудь предоставить мне пример XSL 1.0, чтобы сделать это?

Many Thx!Лоран

<XML_DATA>
    <GROUPID>1</GROUPID>
    <SRO_IF_POLYTERMINE_PRO_PATIENT>
      <XRO_PATNAME>TEST_PHX_99</XRO_PATNAME>
      <TRMBEGIN_Q>20.06.2018 09:30:00</TRMBEGIN_Q>
      <TRMENDE_Q>20.06.2018 10:00:00</TRMENDE_Q>
    </SRO_IF_POLYTERMINE_PRO_PATIENT>
    <SRO_IF_POLYTERMINE_PRO_PATIENT>
      <XRO_PATNAME>TEST_PHX_88</XRO_PATNAME>
      <TRMBEGIN_Q>20.06.2018 08:30:00</TRMBEGIN_Q>
      <TRMENDE_Q>20.06.2018 09:00:00</TRMENDE_Q>
    </SRO_IF_POLYTERMINE_PRO_PATIENT>
    <SRO_IF_POLYTERMINE_PRO_PATIENT>
      <XRO_PATNAME>TEST_PHX_77</XRO_PATNAME>
      <TRMBEGIN_Q>23.06.2018 09:30:00</TRMBEGIN_Q>
      <TRMENDE_Q>23.06.2018 10:00:00</TRMENDE_Q>
    </SRO_IF_POLYTERMINE_PRO_PATIENT>
    <SRO_IF_POLYTERMINE_PRO_PATIENT>
      <XRO_PATNAME>TEST_PHX_66</XRO_PATNAME>
      <TRMBEGIN_Q>21.06.2018 10:30:00</TRMBEGIN_Q>
      <TRMENDE_Q>21.06.2018 11:30:00</TRMENDE_Q>
    </SRO_IF_POLYTERMINE_PRO_PATIENT>
    <SRO_IF_POLYTERMINE_PRO_PATIENT>
      <XRO_PATNAME>TEST_PHX_55</XRO_PATNAME>
      <TRMBEGIN_Q>23.06.2018 09:30:00</TRMBEGIN_Q>
      <TRMENDE_Q>23.06.2018 10:30:00</TRMENDE_Q>
    </SRO_IF_POLYTERMINE_PRO_PATIENT>
</XML_DATA>

1 Ответ

0 голосов
/ 02 июня 2018

Поскольку вы используете XSLT 1.0, вам придется использовать технику, называемую Muenchian Grouping .

Для этого требования будет определен составной ключ, состоящий из date части цепочки элементов <TRMBEGIN_Q> и <TRMENDE_Q>.

<xsl:key name="keyDate" match="SRO_IF_POLYTERMINE_PRO_PATIENT" use="concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10))" />

Далее, for-eachвыполняется цикл для сгруппированных элементов, и в рамках этой группировки элементы сортируются по составным ключам, так что 21.06.2018 появляется до 23.06.2018.

<xsl:for-each select="SRO_IF_POLYTERMINE_PRO_PATIENT[generate-id() = generate-id(key('keyDate',concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))[1])]">
    <xsl:sort select="substring(key('keyDate', concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))/TRMBEGIN_Q, 1, 10)" />
    ....
</xsl:for-each>

Последний шаг - цикл внутри key чтобы извлечь отдельные значения элементов в группе.В этом цикле была применена сортировка для части time.

<xsl:for-each select="key('keyDate', concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))">
    <xsl:sort select="substring(TRMBEGIN_Q, 12, 5)" />
    ....
</xsl:for-each>

Ниже приведен полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />
    <xsl:strip-space elements="*" />

    <xsl:key name="keyDate" match="SRO_IF_POLYTERMINE_PRO_PATIENT" use="concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10))" />

    <xsl:template match="XML_DATA">
        <table border="0" cellspacing="0" cellpadding="5">
            <xsl:for-each select="SRO_IF_POLYTERMINE_PRO_PATIENT[generate-id() = generate-id(key('keyDate',concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))[1])]">
                <xsl:sort select="substring(key('keyDate', concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))/TRMBEGIN_Q, 1, 10)" />
                <tr>
                    <td colspan="2">
                        <b><xsl:value-of select="substring(key('keyDate', concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))/TRMBEGIN_Q, 1, 10)" /></b>
                    </td>
                </tr>
                <xsl:for-each select="key('keyDate', concat(substring(TRMBEGIN_Q, 1, 10), '|', substring(TRMENDE_Q, 1, 10)))">
                    <xsl:sort select="substring(TRMBEGIN_Q, 12, 5)" />
                    <tr>
                        <td><xsl:value-of select="concat(substring(TRMBEGIN_Q, 12, 5), ' - ', substring(TRMENDE_Q, 12, 5))" /></td>
                        <td><xsl:value-of select="XRO_PATNAME" /></td>
                    </tr>
                </xsl:for-each>
            </xsl:for-each>
        </table>
    </xsl:template>
</xsl:stylesheet>

. В результате создается таблица HTML, которая выглядит следующим образом.

Output HTML Table

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