java - 如何在撒克逊语中扩展 doc() 功能
问题描述
我正在寻找 SAXON 中当前可用的 doc() 功能的扩展,它不会从文件系统或 http 网络中读取 XML,而是从我拥有这些 xml 的内存中读取 XML。
我想使用它的方式是:
mydoc('id')/root/subroot/@myattr
或者
doc('mydoc://id')/root/subroot/@myattr
到目前为止我所考虑的:
- 使用 queryEvaluator.setContextItem() - 不能解决我的用例,因为我可以在一个查询中拥有多个 XML 源
- 将一些自己的 URL 方案协议注册到 Java 中 - 在我看来像是矫枉过正,我从来没有这样做过
- 编写自己的 ExtensionFunction - 到目前为止似乎是正确的方法,但我很困惑我应该使用 ExtensionFunction 还是 ExtensionFunctionDefinition。此外,我对 Doc_1 和 Doc Saxonica 源代码有点困惑,因为它使用了 Atomizer 和其他未知的内部东西。
所以问题是:
- 变体 3 是最好的变体(为了简单起见)还是您会推荐其他方法?
- 可以使用 ExtensionFunction 并从我的内存中的 xmls 返回 XdmNode 吗?在我看来它应该可以工作,但我真的不想进入一些边缘案例或撒克逊雷区。
经验丰富的撒克逊用户的任何评论将不胜感激。
解决方案
执行此操作的标准方法是编写 aURIResolver
并将其注册到转换器。被URIResolver
调用,提供所请求的 URI,并且预计会返回一个 Source(例如,可以是StreamSource
、SAXSource
或DOMSource
)。在这种情况下,您通常会返回一个StreamSource
包装 a StringReader
,它包装String
包含 XML 的内容。
您同样可以使用扩展功能,但它可能有点复杂。
推荐阅读
- regex - 数据工作室正则表达式计算字段替换后|
- javascript - 无法加载静态页面
- c# - 有什么方法可以先在 Visual Studio 2017 中创建一个空白解决方案 (.sln) 文件,然后再添加项目?
- vba - 使用 VBA 将 excel 表数据导出到 Access DB - “INSERT INTO”的无尽问题
- java - SonarQube 暗示 var 为 null 或可以为 null
- haskell - 模板 Haskell:为具有类型类约束的函数签名生成代码
- concurrency - Netty,并发 writeAndFlush
- git - 您是否总是使用 GitHub Flow 从 `master` 中创建一个分支?
- javafx - 如何将语言环境设置为文本字段
- python - Python - 在写入模式下如何在文件中跳转行?