首页 > 解决方案 > 按不同的日期格式排序(mmddyyyy)-xslt

问题描述

我在 XML 中有一个日期字段,它将始终采用 MMDDYYYY 格式。我正在尝试通过以下代码使用日期进行排序:

 <xsl:sort select="format-date(Date, '[M01][D01][Y0001]')"/>

需要帮助解决。通过在 sort 中调用一个函数,我得到了一个线索,我们可以将其转换为 ISO 格式。当某些 XML 元素中没有出现 Date 字段时,我们可以忽略调用该函数吗?

以下示例显示了输入 XML 以及 XSLT 代码:

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<EmpD>
   <PR>
      <RType>02</RType>
      <Emp>888</Emp>
   </PR>
   <PR>
      <RType>02</RType>
      <Emp>889</Emp>
   </PR>
   <JR>
      <RType>01</RType>
      <Emp>888</Emp>
      <Type>C</Type>
      <EDate>05012020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>888</Emp>
      <Type>NC</Type>
      <EDate>05022019</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>888</Emp>
      <Type>C</Type>
      <EDate>05022020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>889</Emp>
      <Type>C</Type>
      <EDate>05012020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>889</Emp>
      <Type>NC</Type>
      <EDate>05012020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>889</Emp>
      <Type>NC</Type>
      <EDate>05032019</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
</EmpD>

XSLT 代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ab="test" exclude-result-prefixes="#all" version="3.0">

<xsl:function name="ab:us-date-to-iso" as="xs:date">
   <xsl:param name="us-date" as="xs:string"/> <!-- format MMDDYYYY -->
   <xsl:sequence select="xs:date(replace($us-date, '(..)(..)(....)', '$3-$1-$2'))"/>
</xsl:function>

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>
    
 
  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="EmpD">
      <xsl:copy>
          <xsl:apply-templates select="*">
              <xsl:sort select="Emp"/>
              <xsl:sort select="RType"/>
              <xsl:sort select="ab:us-date-to-iso(EDate)"/>
          </xsl:apply-templates>
      </xsl:copy>
  </xsl:template>
  
 </xsl:stylesheet>

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<EmpD>
   <JR>
      <RType>01</RType>
      <Emp>888</Emp>
      <Type>NC</Type>
      <EDate>05022019</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>888</Emp>
      <Type>C</Type>
      <EDate>05012020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>888</Emp>
      <Type>C</Type>
      <EDate>05022020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <PR>
      <RType>02</RType>
      <Emp>888</Emp>
   </PR>
   <JR>
      <RType>01</RType>
      <Emp>889</Emp>
      <Type>NC</Type>
      <EDate>05032019</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>889</Emp>
      <Type>C</Type>
      <EDate>05012020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   <JR>
      <RType>01</RType>
      <Emp>889</Emp>
      <Type>NC</Type>
      <EDate>05012020</EDate>
      <HR>1210148900</HR>
      <JobC>Test</JobC>
   </JR>
   
   <PR>
      <RType>02</RType>
      <Emp>889</Emp>
   </PR>
</EmpD>

标签: sortingdatexslt-3.0

解决方案


推荐阅读