首页 > 解决方案 > 如何在xslt中执行java函数

问题描述

我正在尝试使用 XSLT 文件中的 java 命名空间获取日期,并从中减去 X 天。如何从xslt中的日期减去天数?

我尝试使用 java 命名空间来获取当前日期并使用 java.time.LocalDate.now().minusDays(2) 天数。它在java中工作正常,但在xslt中它失败了

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                              xmlns:xs="http://www.w3.org/2001/XMLSchema"
                              xmlns:java="http://xml.apache.org/xslt/java" 
                              xmlns:xalan="http://xml.apache.org/xalan"
                              xmlns:fn="http://www.w3.org/2005/xpath-functions"
                              xmlns:datetime="http://exslt.org/dates-and-times"
                              xmlns:math="http://exslt.org/math"
                              xmlns:date="http://www.date.org/"
                              xmlns:exslt="http://exslt.org/common"
                              xmlns:js="javascript:code"
                              exclude-result-prefixes="java"
                              extension-element-prefixes="mcr">

    <xsl:variable name="test" select="java:java.time.LocalDate.now().minusDays(2)"/>

当我在选择中仅使用“java:java.time.LocalDate.now()”时,我将今天的日期作为输出。只有 minusDays() 函数似乎不起作用。

我期待的输出是 yyyy-MM-dd 格式的 currentDate 减去 2 天。例如:如果今天的日期是 2019 年 6 月 12 日输出:2019-06-10

标签: xsltxslt-1.0

解决方案


这是一个有效的 XPath 函数调用:java:java.time.LocalDate.now(),Xalan 将其解释为对外部 Java 静态方法的调用。

然后用“.”跟随它。但 ”。” 不是 XPath 中的有效运算符。如果要将一个 XPath 函数应用于F()另一个函数的结果G(),则不能使用 Java 语法F().G(),而必须使用 XPath 语法G(F())。这意味着您需要使用与 minusDays() 对应的完全限定函数名。

由于您使用的是 Java,因此您可以切换到 Saxon,它支持 XSLT 2.0 中内置的所有日期和时间函数,因此所有这些调用 Java 来进行简单的日期/时间运算的操作都变得不必要了。


推荐阅读