SAXON 10 日期时间始终作为字符串处理,尽管有日期时间变量

问题描述 投票:0回答:1

最近我从 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)

如果我能快速得到合适的答案,那将会非常有帮助。

尝试查看撒克逊文档,但信息很少或更少。

xpath xslt saxon xslt-3.0
1个回答
0
投票

确实,直到 Saxon 9.3 左右(即大约 10 年前),AtomicValue 类都实现了 Serialized,我可以想象应用程序可能会受到我们更改它这一事实的影响。我觉得有点令人惊讶的是它应该具有您所描述的症状,但是如果您向我们展示了一些代码,我想我们可以解决它,并建议您进行哪些更改来恢复以前的行为。

© www.soinside.com 2019 - 2024. All rights reserved.