sorting - 根据列表中的日期字段在每一天使用 XSLT 1.0 对列表进行分组
问题描述
我有以下 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 示例来执行此操作吗?
很多谢谢!洛朗
<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>
解决方案
由于您使用的是 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 表格。
推荐阅读
- angularjs - AngularJS基于带有单选按钮的文本字段创建过滤器作为搜索子类别
- spring - 为什么 Spring RestTemplate 在 Spring 中默认不是 Bean?
- excel - PowerShell 脚本要求输入密码并使用它来打开 excel 文件
- javascript - 从源代码显示 base64 图像 HTML
- themes - 在 Keycloak terms.ftl 中访问用户属性
- asp.net - 在 SQL 中的行数据的 asp.net 标签中显示 SUM
- macos - Mac OS Automator pdf to jpg 快速操作不起作用
- excel - 需要创建一个循环直到最后一行,但仅限于某些范围
- gml - 错误:尝试设置不存在的表面目标
- mysql - DISTINCT 返回比原始表更多的结果