sorting - 按不同的日期格式排序(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>
解决方案
推荐阅读
- r - cbind 基于值的新列
- c# - 属性依赖于其他属性
- android - 内部错误。请在 MacBook 中打开 Android Studio 时向 https://code.google.com/p/android/issues 报告
- sql - How does the SQL function COALESCE() work?
- python - 我的代码部分将列表输出作为数据框列写入 csv,但之后中断
- c - OpenBSD 驱动程序开发:如何配置 GPIO 驱动程序以在用户空间中使用它?
- java - A puzzle on how Java implement volatile in new memory model (JSR 133)
- php - Nginx 中的 Laravel API 重写无法打开主脚本
- c# - 无法在 AleaTK 中使用 Context.GpuContext,因为缺少对程序集的引用。C#
- coldfusion - 网站如何显示“帮助”块,直到用户单击 X 以不再看到它们