最近我从 Saxon 9 (XSLT 2.0) 迁移到 Saxon 10 (XSLT 3.1)。我有一个变量 $datetime 变量,其类型为 DateTime ,每当我在 java 应用程序中的 XPATH 表达式计算器中使用该变量时,我都直接使用该变量,并且它用于作为所述变量类型进行处理。
但是,对于 Saxon 10 (XSLT 3.1),求值期间此变量始终作为字符串类型进行处理。我阅读了文档,其中 AtomicValue 在 Saxon 10.5 中被设置为不可序列化,因此它被处理为字符串类型。
我找到了一种解决方法,如果我将变量类型转换为
xs:datetime($datetime)
,那么表达式就会被求值。
目前可供参考的表述如下:
current-dateTime() - $datetime
我得到的错误是
Unsuitable types for- operation (xs:dateTimestamp, xs:string)
所以这里第二个参数被 saxon 处理器视为字符串。
参考代码
XSDateTimeDummyProperty.java
public class XSDateTimeDummyProperty extends SaxonParentProperty<DateTimeValue> {
public static <T> T completeCopy(T orig) {
if (orig == null) {
return null;
}
try {
FastByteArrayOutputStream fbos = new FastByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(fbos);
out.writeObject(orig);
out.flush();
out.close();
return (T) new ObjectInputStream(fbos.getInputStream()).readObject();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
public static <T> T normalCopy(T orig) {
if (orig == null) {
return null;
}
T copiedRef = orig;
return (T) copiedRef;
}
public static void main(String[] args) {
XSDateTimeDummyProperty originalArgument = new XSDateTimeDummyProperty();
originalArgument.setValue("2020-07-01T11:44:10.011705+02:30"); //dummyDATETIME-String
XSDateTimeDummyProperty deepCopiedReference = XSDateTimeDummyProperty.completeCopy(originalArgument); // java.io.NotSerializableException occurs
XSDateTimeDummyProperty normalCopiedReference = XSDateTimeDummyProperty.normalCopy(originalArgument);
System.out.println(deepCopiedReference);
System.out.println(normalCopiedReference);
}}
SaxonParentProperty.java
public abstract class SaxonParentProperty<T extends AtomicValue> {
T obj;
protected void setValue(Object value) {
ConversionResult conversionResult = DateTimeValue.makeDateTimeValue((CharSequence) value, ConversionRules.DEFAULT);
this.obj = (T) conversionResult;
}}
运行时错误:
Exception in thread "main" java.lang.RuntimeException: java.io.NotSerializableException: com.xxx.utils.property.type.XSDateTimeDummyProperty
at com.xxx.utils.property.type.XSDateTimeDummyProperty.completeCopy(XSDateTimeDummyProperty.java:28)
如果我能快速得到合适的答案,那将会非常有帮助。
尝试查看撒克逊文档,但信息很少或更少。
确实,直到 Saxon 9.3 左右(即大约 10 年前),AtomicValue 类都实现了 Serialized,我可以想象应用程序可能会受到我们更改它这一事实的影响。我觉得有点令人惊讶的是它应该具有您所描述的症状,但是如果您向我们展示了一些代码,我想我们可以解决它,并建议您进行哪些更改来恢复以前的行为。