XSLT按员工编号、年、月、日、时、分、秒对节点进行排序
我有一个XML,希望:XSLT按员工编号、年、月、日、时、分、秒对节点进行排序,xslt,xslt-1.0,xslt-2.0,xslt-3.0,Xslt,Xslt 1.0,Xslt 2.0,Xslt 3.0,我有一个XML,希望: 按员工编号排序,并按年、月、日升序为每个预订时间排序 例如: <?xml version="1.0" encoding="UTF-8"?> <root> <entry> <employeeName>Bob the Builder</employeeName> <employeeNumber>00290035</employeeNumber>
- 按员工编号排序,并按年、月、日升序为每个预订时间排序
<?xml version="1.0" encoding="UTF-8"?>
<root>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
鲍勃工程队
00290035
G
2019
3.
18
14
52
0
鲍勃工程队
00290035
C
2019
3.
18
14
22
0
迈克·泽
00200060
C
2019
3.
17
10
15
0
有人能帮我做好这件事吗?使用的XSLT版本可以是任何版本,无需特定版本
我做了一个小提琴(),对employeeNumber works、年/月等的排序失败。此样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="entry">
<xsl:sort select="employeeNumber" data-type="number"/>
<xsl:sort select="bookingtime/year" data-type="number"/>
<xsl:sort select="bookingtime/month" data-type="number"/>
<xsl:sort select="bookingtime/day" data-type="number"/>
<xsl:sort select="bookingtime/hours" data-type="number"/>
<xsl:sort select="bookingtime/minutes" data-type="number"/>
<xsl:sort select="bookingtime/seconds" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
有你的意见吗
<root>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
鲍勃工程队
00290035
G
2019
3.
18
14
52
0
鲍勃工程队
00290035
C
2018
3.
18
14
22
0
迈克·泽
00200060
C
2019
3.
17
10
15
0
输出:
<root>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
迈克·泽
00200060
C
2019
3.
17
10
15
0
鲍勃工程队
00290035
C
2018
3.
18
14
22
0
鲍勃工程队
00290035
G
2019
3.
18
14
52
0
注意:如果您正在对
条目
元素进行排序,则可以将每个条目
的任何相对路径用作xsl:sort
指令的select
属性的上下文。这是排序(输出每个条目)不同于分组(输出disctint条目
并计算一些聚合)我喜欢Aljandro的答案,但如果有人坚持使用更高版本的XSLT,并将值真正视为年、月、月日、小时的值,分和秒,然后可以使用下面的内容
此转换看起来可能有点复杂,但它将的子对象视为这些类型化对象的值,如果遇到无效的组件值,例如2月30日、月13日、小时25日或分/秒61,则会抛出错误
当此转换应用于提供的源xml文档时:
<root>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
<root>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
鲍勃工程队
00290035
G
2019
3.
18
14
52
0
鲍勃工程队
00290035
C
2018
3.
18
14
22
0
迈克·泽
00200060
C
2019
3.
17
10
15
0
生成所需的正确结果:
<root>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
<root>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
迈克·泽
00200060
C
2019
3.
17
10
15
0
鲍勃工程队
00290035
C
2018
3.
18
14
22
0
鲍勃工程队
00290035
G
2019
3.
18
14
52
0
是否要按员工用户对条目
元素进行排序?还是将他们分组?如果您只想对它们进行排序,那么按照年
/月
/日
组件应该实现的预订时间
排序是什么,因为示例数据中的每个条目
似乎只有一个预订时间
元素?一般来说,向我们展示您的排序尝试,任何关于XSLT的教程都肯定会使用xsl:sort
和xsl:for each
/xsl:apply templates
/
来展示您的尝试。我添加了一个指向我创建的小提琴的链接。不需要分组,按雇员编号排序,下一步按预订时间(年/月/日/小时/升序)排序。考虑在问题中显示职位。那么你想要的结果是什么?我仍然不清楚是否要简单地按所有这些排序键对条目
元素进行排序(然后简单地在执行xsl:sort select=“employeeNumber”
的位置添加更多的…
)或者在需要排序的条目中有多个bookingtime
元素。您应该使用data type=“number”
对数字字段进行排序,否则11将在3之前排序。