【问题标题】:XSLT 2 : How to pass an input stream as a parameter to XSL sheetXSLT 2:如何将输入流作为参数传递给 XSL 工作表
【发布时间】:2021-10-22 00:12:01
【问题描述】:

我正在使用 Saxon HE 10 (使用 Xslt30Transformer)

如何将输入流作为参数传递给 XSL?

我看到有一个 setStylesheetParameters 。如何发送输入流,因为这需要 XdmValue 类型的对象?

我以前是设置文件名参数,而是尝试传递流

【问题讨论】:

  • 为什么您的 XSLT 2 代码需要接收和使用流?如果您使用 Java 或 C# API 设置参数并希望设置从流中解析的 XdmNode 参数,您可以使用 DocumentBuilder 将流解析为 XdmNode 并将其传入。
  • 我认为如果你真的希望 XSLT 处理一个流,你宁愿有一个 URL 解析器来确保某个 URI 参数,例如doc() 从该流中读取数据。
  • @MartinHonnen 谢谢你的意见。我能够使用 URIResolver 来实现这一点。基本上得到了 Document form input stream ,将其设置为参数。转换器中的 SetURI 解析器。 transformer.setURIResolver((href, base) -> new DOMSource(parameters.get(href)));
  • 如果您还需要使用 W3C DOM API,则使用 DOMSource 只是一个很好的输入源,否则 Saxon 有自己的原生树模型,它应该性能更好并且消耗更少的内存。

标签: xslt-2.0 saxon xslt-3.0


【解决方案1】:

您可以通过将任何Java 对象(包括Stream)包装在XdmExternalObjectXdmValue 的子类)中来传递它。但这是个好主意吗?你到底想达到什么目的? Stream 是一个可变对象(从流中读取会改变它的状态),可变对象和 XSLT 不能很好地结合在一起。如果我们知道您想要实现的目标,我们或许可以提出更好的设计建议。

【讨论】:

  • 我正在从一个 xml 队列中读取消息。我不想将它存储在文件位置,而是处理(使用 xslt 将 xml 转换为其他)文件。
  • 然后将其作为字符串传递,这是一个原生的XDM数据类型,是不可变的。
  • 谢谢。会试试的
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2022-06-10
  • 2012-11-03
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多