You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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>

错误原因分析
  1. 语法错误:<xsl:then>未正确配对
    <xsl:then>只能作为<xsl:choose>的子节点使用,不能单独跟在<xsl:if>后面,这会导致XSLT解析失败。
  2. min()/max()函数用法错误
    min()/max()仅接收节点序列作为参数,不能把日期格式字符串当作第二个参数传入。正确逻辑是先通过min()/max()获取日期节点的极值,再传入format-date()进行格式化。
  3. 节点筛选逻辑错误
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:25:32