【问题标题】:Saxon-HE Integrated Extension FunctionsSaxon-HE 集成扩展功能
【发布时间】:2014-11-04 18:21:48
【问题描述】:

我最初应该通过说明我们的代码使用嵌入式 saxon 扩展函数 - saxon:parse($xml) 来发布我的问题,它返回 xml 的根元素/节点。但是,在 Saxon-HE 中,该扩展不再可用 - 所以我正在尝试编写一个集成扩展,将 xml 字符串解析为文档并返回根元素。

我正在使用 Saxon-HE 9.5.1.6 - 我正在尝试编写一个返回文档根节点的集成扩展函数。该函数接收一个 xml 字符串 - 创建一个文档并需要将根节点返回到 xslt 以便它使用 xpath 查找特定元素。 ExtensionFunctionCall 类/类型的 call() 方法返回一个序列类型 - 我如何返回一个 NodeSequence 或 NodeType?如何从我的 Document 构造 NodeSequence?

我可以单步调试并确认函数接收到正确的 xml - 将其解析为文档,但到目前为止我无法确定如何使用我的 RootElement 构造 NodeSequence。

我还有其他返回 StringValue 的集成扩展函数——它们工作得很好,但我无法从可用的类方法中收集到如何从 ExtensionFunctionCall 返回除简单(数字/阿尔法/项目)类型以外的任何内容

谢谢。

【问题讨论】:

  • 你能告诉我们(相关部分)你的代码吗?
  • 私有静态类 SurveyParseCall 扩展 ExtensionFunctionCall{
  • 私有静态类 SurveyParseCall 扩展 ExtensionFunctionCall{ @Override public Sequence call(XPathContext context, Sequence[] arguments)throw XPathException{ Sequence seq = arguments[0];字符串 xml = ((StringValue)seq.head()).getStringValue(); DocumentBuilderFactory = DocumentBuilderFactory.newInstance(); //下面是一个尝试捕获 - 这里省略 DocumentBuilder builder = factory.newDocumentBuilder; Document document = builder.parse(new InputSource(new StringReader(xml))); //这里需要返回document.getDocumentElement();
  • 与其在 cmets 中发布代码(不保留格式),不如编辑原始问题并在其中添加代码。您可以随时编辑自己的帖子,并在积累更多声望点后可以编辑其他人的帖子。
  • 这里要注意的主要一点是,如果你只想解析词法XML返回一个文档树,那么使用Saxon的树实现比使用DOM快10倍。 (该函数也可用作 saxon:parse() 或 fn:parse-xml(),但遗憾的是在 Saxon-HE 中没有。)

标签: java xml xslt saxon


【解决方案1】:

DocumentInfo类实现了Sequence,所以如果你返回一个DocumentInfo,那将满足接口。您可以使用

构造 DocumentInfo
context.getConfiguration().buildDocument()

如果您想使用一些外部对象模型(例如 DOM 或 JDOM2)构建文档,则需要获取该外部文档的根节点并将其包装在适当类型的 Saxon DocumentWrapper 中以使其成为 DocumentInfo。

【讨论】:

  • 谢谢!效果很好: Source source = new StreamSource(new StringReader(myXMLparam)); DocumentInfo docInfo = context.getConfiguration().buildDocument(source);返回文档信息;我的问题是 - 我昨天大部分时间都在尝试从查看类到文档来发现如何做到这一点 - 文档中是否有某个地方对此进行了描述?再次感谢!
  • Saxon 文档的问题在于它太多了,很难找到您正在寻找的部分。我们当然可以使用更好的指南来编写集成扩展功能:恐怕 9.5 版本甚至都不是最新的。最好习惯于在 Javadoc 中找到自己的方式;或者使用 IDE 可以帮助您告诉您像 Sequence 这样的类的可能子类是什么。
  • context 来自哪里?我看没有这样的东西传递给ExtensionFunction
  • @MartynasJusevičius 我建议你问一个新问题。事情会随着时间而改变。
  • @MichaelKay 好的。我在这里创建了一个:stackoverflow.com/questions/60899154/…
【解决方案2】:

对于任何正在阅读的人 - 在此之后,我能够在 Michael Kay 的帮助下完成这项工作 - 我的解决方案如下:

Source source = new StreamSource(new StringReader(myXMLparam));
DocumentInfo docInfo = context.getConfiguration().buildDocument(source);
return docInfo;

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多