当前位置: 首页 > 知识库问答 >
问题:

从Saxon转换获取序列化属性

梁韬
2023-03-14

我有以下XSL样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
   <xsl:output encoding="UTF-8" method="xml"/>
   <xsl:template match="/">
      <test/>
   </xsl:template>
</xsl:stylesheet>

我正在使用Saxon 9.9对其进行如下转换。

public String transform(InputStream input, InputStream stylesheet, OutputStream output){
  Processor p = new Processor(false);
  XsltCompiler c = p.newXsltCompiler();
  XsltExecutable e = c.compile(new StreamSource(stylesheet));
  Xslt30Transformer xf = e.load30();
  Serializer s = p.newSerializer(output);
  xf.transform(new StreamSource(input), s);
  return s.getOutputProperty(Serializer.Property.ENCODING));
}

我希望返回值是样式表中指定的“UTF-8”,但它返回null。(序列化程序实例似乎根本没有属性。)这是为什么?获取输出属性的正确方法是什么?

共有1个答案

戚繁
2023-03-14

不幸的是,XSLT转换引擎和序列化程序之间的接口非常混乱。XSLT规范、JAXP规范和Saxon规范都很混乱。多年来,我曾多次尝试改进它,但它仍然很混乱。Saxon 9.9中进行了一些更改,这是由于新的看似无辜的属性(在XSLT中几乎无用)项分隔符属性所必需的,该属性的效果是,将单个项组合到文档树中(如果发生的话)必须发生在边界的序列化端,而不是转换端。

Saxon 9.9 s9api接口中的情况是(通常)Serializer对象对样式表中定义的序列化属性一无所知,它只知道那些直接通过Serializer API提供的属性。只有当Transex调用Serializer执行序列化时,两组序列化属性才会组合起来。

例外情况是当您使用Xslt30Transformer.newSerializer()创建序列化器时。在这种情况下,序列化器是使用样式表中未命名的xsl: out声明中定义的属性初始化的,就好像它们是使用serializer.setOutputProperty()显式设置的一样。

样式表中定义的序列化属性可用(尽管不是很直接)作为s9apiXsltExecable的属性。这有一个方法getUnderlyingCompiledStylesheet(),它返回一个准备Stylesheet对象,这有一个方法getDeclaredSerializationProperties(),它返回在默认(未命名)xsl:输出声明中定义的属性。还有一个方法getOutputProperties(name),它返回命名输出格式的属性(如xsl: product-Document中使用的)

 类似资料:
  • 我以前问过这个问题,但现在我试图获得XQuery计算的序列化属性,而不是XSLT转换。 使用此代码: 原始问题答案中提出的方法似乎不适用于这里,因为我无法从XQueryEvaluator实例化序列化程序,而getDeclaredSerializationProperties只能在XSLT上下文中使用。 我用的是萨克森10他。

  • 我的查询对象是 但是 <代码>列表 将结果列表转换为classNameList。当我迭代单个值时,我的实体值在ClassName属性中为空。调用getter方法时不显示值。我的pojo看起来如下所示,当我打印pojo的值为空时,我的foreach正好迭代四次。 我的查询对象来自com.google.cloud.firestore包。和ApiFuture来自com.google.api.core.A

  • ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为java.util.HashMap 提前谢了。

  • 问题内容: 我有一个对象,该对象正在使用ServiceStack.Text命名空间中的方法进行反序列化。 如何在序列化过程中忽略所有唯一属性?有没有类似属性或可以用来装饰属性的东西,可以将其省略? 谢谢 问题答案: ServiceStack的文本序列化程序遵循.NET的DataContract序列化程序行为,这意味着您可以使用opt- out 属性忽略数据成员 选择加入的方法是装饰要序列化的每个属

  • 问题内容: 我试图弄清楚如何从我的API返回一个核心对象 其中T是一些具有属性的对象,例如 使用 将属性返回为,正确的是。 但是,如果我想使用名称作为类型呢?因此,响应Json实际上将包含一个名为not 的属性,如下所示。 我很好奇是否有一个相对简单的方法可以用Json.net做到这一点,或者您是否必须创建一个自定义并在编写时使用反射来获取类型名称? 谢谢。 问题答案: 据我所知,没有内置的方法可

  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将