Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
Xml XSLT:如何对日期进行排序_Xml_Sorting_Xslt - Fatal编程技术网

Xml XSLT:如何对日期进行排序

Xml XSLT:如何对日期进行排序,xml,sorting,xslt,Xml,Sorting,Xslt,我有一个关于排序日期和时间的问题 我找到了一个解决方案,但这个解决方案对我不起作用 假设我有一个xml。日期顺序为月、日和年 <persons> <person> <name>1</name> <birthday>021514</birthday> </person> <person> <name>2</name> <b

我有一个关于排序日期和时间的问题

我找到了一个解决方案,但这个解决方案对我不起作用

假设我有一个xml。日期顺序为月、日和年

<persons>
  <person>
     <name>1</name>
     <birthday>021514</birthday>
  </person>
  <person>
     <name>2</name>
     <birthday>051513</birthday>
  </person>
</persons>
但我想要的实际结果是

021514
051513    
只有第一种有效。其余的都不起作用了。
这个代码怎么了?任何帮助都将不胜感激。

只需更改排序条件的顺序。
你应该按年、按月、按日开始

<xsl:for-each select="//person">
  <!-- year -->
  <xsl:sort select="substring(birthday, 5, 2)" order="descending" data-type="number"/>
  <!-- month -->
  <xsl:sort select="substring(birthday, 1, 2)" order="descending" data-type="number"/>
  <!-- day -->
  <xsl:sort select="substring(birthday, 3, 2)" order="descending" data-type="number"/>
  <xsl:value-of select="birthday"/>
</xsl:for-each>

如果您有使用MMDDYY作为日期格式的XML,那么它就是设计糟糕的XML,处理设计糟糕的XML最好的方法是在执行任何其他操作之前在预处理阶段将其清理干净。编写一个样式表,其唯一目的是将XML清理成更好的内容,然后将转换任务作为一个单独的处理阶段来考虑

在本例中,您希望以ISO格式YYYY-MM-DD创建日期。我不确定推断世纪的规则是什么,但我将编写如下内容(需要XSLT 2.0):


与你打交道的人都不到14岁吗?
021514
051513    
<xsl:for-each select="//person">
  <!-- year -->
  <xsl:sort select="substring(birthday, 5, 2)" order="descending" data-type="number"/>
  <!-- month -->
  <xsl:sort select="substring(birthday, 1, 2)" order="descending" data-type="number"/>
  <!-- day -->
  <xsl:sort select="substring(birthday, 3, 2)" order="descending" data-type="number"/>
  <xsl:value-of select="birthday"/>
</xsl:for-each>
<xsl:template match="birthday">
  <xsl:copy>
    <xsl:variable name="year" select="substring(., 5, 2)"/>
    <xsl:variable name="month" select="substring(., 1, 2)"/>
    <xsl:variable name="day" select="substring(., 3, 2)"/>
    <xsl:value-of select="if (number($year) gt 20 then '19' else '20'"/>
    <xsl:value-of select="$year, $month, $day" separator="-"/>
  </xsl:copy>
</xsl:template>