Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT按员工编号、年、月、日、时、分、秒对节点进行排序_Xslt_Xslt 1.0_Xslt 2.0_Xslt 3.0 - Fatal编程技术网

XSLT按员工编号、年、月、日、时、分、秒对节点进行排序

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,希望:

  • 按员工编号排序,并按年、月、日升序为每个预订时间排序
例如:

<?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之前排序。