编写XSLT获取并格式化一人多次LOA起止日期时遇参数错误求助
问题描述
编写XSLT处理员工休假(LOA)数据时,遇到「参数过多」错误。需求是从XML的两个<ws:Leave_of_Absence>节点中,获取最早的休假开始日期和最晚的休假结束日期并格式化为8位数字(YYYYMMDD),但现有代码无法正常运行。
现有错误代码
<LOA_Start_Date xtt:fixedLength="8"> <xsl:if test="ws:Status/ws:Employee_Status = 'On_Leave'"> <xsl:value-of select="ws:Leave_of_Absence = ws:On_Leave['true']"/> </xsl:if> <xsl:then> <xsl:value-of select="format-date(min(ws:Leave_Start_Date, '[Y0001][M01][D01]'))"/> </xsl:then> </LOA_Start_Date> <LOA_End_Date xtt:fixedLength="8"> <xsl:if test="ws:Status/ws:Employee_Status = 'Return_From_Leave'"> <xsl:value-of select="ws:Leave_of_Absence = ws:On_Leave['false']"/> </xsl:if> <xsl:then> <xsl:value-of select="format-date(max(ws:Leave_End_Date, '[Y0001][M01][D01]'))"/> </xsl:then> </LOA_End_Date>
对应XML片段
<ws:Leave_of_Absence> <ws:On_Leave>true</ws:On_Leave> <ws:Leave_Start_Date>2022-10-27</ws:Leave_Start_Date> </ws:Leave_of_Absence> <ws:Leave_of_Absence> <ws:On_Leave>false</ws:On_Leave> <ws:Leave_Start_Date>2022-10-24</ws:Leave_Start_Date> <ws:Leave_End_Date>2022-10-27</ws:Leave_End_Date> </ws:Leave_of_Absence>
错误原因分析
- 语法错误:
<xsl:then>未正确配对<xsl:then>只能作为<xsl:choose>的子节点使用,不能单独跟在<xsl:if>后面,这会导致XSLT解析失败。 min()/max()函数用法错误min()/max()仅接收节点序列作为参数,不能把日期格式字符串当作第二个参数传入。正确逻辑是先通过min()/max()获取日期节点的极值,再传入format-date()进行格式化。- 节点筛选逻辑错误
ws:Leave_of_Absence = ws:On_Leave['true']不符合XPath语法,筛选On_Leave为true的休假节点,应该用ws:Leave_of_Absence[ws:On_Leave='true']。
修正后的XSLT代码
获取最早休假开始日期
<LOA_Start_Date xtt:fixedLength="8"> <!-- 员工状态为On_Leave时,计算所有休假节点中最早的开始日期 --> <xsl:if test="ws:Status/ws:Employee_Status = 'On_Leave'"> <xsl:value-of select="format-date(min(ws:Leave_of_Absence/ws:Leave_Start_Date), '[Y0001][M01][D01]')"/> </xsl:if> </LOA_Start_Date>
获取最晚休假结束日期
<LOA_End_Date xtt:fixedLength="8"> <!-- 员工状态为Return_From_Leave时,计算所有休假节点中最晚的结束日期 --> <xsl:if test="ws:Status/ws:Employee_Status = 'Return_From_Leave'"> <xsl:value-of select="format-date(max(ws:Leave_of_Absence/ws:Leave_End_Date[. != '']), '[Y0001][M01][D01]')"/> </xsl:if> </LOA_End_Date>
说明
min(ws:Leave_of_Absence/ws:Leave_Start_Date):遍历所有<ws:Leave_of_Absence>节点,提取其中的<ws:Leave_Start_Date>,返回最小的日期值。max(ws:Leave_of_Absence/ws:Leave_End_Date[. != '']):筛选出非空的<ws:Leave_End_Date>节点,返回最大的日期值,避免因空节点导致计算错误。format-date(..., '[Y0001][M01][D01]'):将日期格式化为YYYYMMDD的8位数字格式,符合xtt:fixedLength="8"的要求。
内容的提问来源于stack exchange,提问作者tiffany asbell
相关产品推荐
相关产品推荐

