【问题标题】:Getting serialization properties from an XQueryEvaluator in Saxon从 Saxon 中的 XQueryEvaluator 获取序列化属性
【发布时间】:2020-09-13 16:28:55
【问题描述】:

我已经问过这个问题before,但现在我正在尝试获取 XQuery 评估而不是 XSLT 转换的序列化属性。

使用此代码:

public static void main(String[] args) throws SaxonApiException {
    Processor p = new Processor(false);
    XQueryEvaluator e = p.newXQueryCompiler().compile(
            "xquery version \"3.0\";" +
            "declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\"; " +
            "declare option output:encoding \"utf-8\";" +
            "<x s='ó'/>").load();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    Serializer s = p.newSerializer(os);
    e.setDestination(s);
    e.run();
    assert "utf-8".equals(s.getCombinedOutputProperties(null).getProperty("encoding")); //fails
}

原始问题的答案中提出的方法似乎不适用于此处,因为我无法从 XQueryEvaluator 实例化序列化程序,而 getDeclaredSerializationProperties 仅在 XSLT 上下文中可用。

我正在使用 Saxon 10 HE。

【问题讨论】:

  • 您使用哪个版本的 Saxon 或您的目标是哪个版本?
  • 我正在使用 Saxon 10 HE。

标签: xquery saxon


【解决方案1】:

来自XQueryExecutablee:

e.getUnderlyingCompiledQuery().getExecutable().getPrimarySerializationProperties()

我无法立即从XQueryEvaluator 中找到方法,但由于XQueryEvaluator 始终是通过调用XQueryExecutableXQueryExecutable 创建的,因此您应该可以从那里开始。

【讨论】:

    【解决方案2】:

    如果您将Serializer 子类化并覆盖方法getReceiver 以访问/存储传递给该方法的SerializationParameters,这可能是可能的:

    public class MySerializer extends Serializer {
    
        public MySerializer(Processor processor) {
            super(processor);
        }
        
        
        private SerializationProperties mySerProps;
        
        public SerializationProperties getSerProps() {
            return mySerProps;
        }
        @Override
        public Receiver getReceiver(PipelineConfiguration arg0, SerializationProperties arg1) throws SaxonApiException {
            mySerProps = arg1;
            return super.getReceiver(arg0, arg1);
        }
    
    }
    

    然后使用例如

            MySerializer s = new MySerializer(p);
            s.setOutputStream(os);
            e.setDestination(s);
            e.run();
            assert "utf-8".equals(s.getSerProps().getProperty("encoding")); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2019-07-05
      • 1970-01-01
      相关资源
      最近更新 更多