【问题标题】:Imported XSLT stylesheet URIs in Saxon 9.8Saxon 9.8 中导入的 XSLT 样式表 URI
【发布时间】:2017-11-08 04:08:07
【问题描述】:

我需要帮助以找到解决以下问题的方法,并希望在出现错误时将其揭露:

我目前正在使用json-doc($url) 来访问 Web api 并直接在 xslt 样式表上使用它。

例如json-doc('https://localhost:8443/api/endpoint')

一切都很好,没问题。

当我使用它时,将 xslt 导入另一个样式表,这就是事情发生的时候。

<xsl:import href="classpath:childthatbreaks.xslt" />

net.sf.saxon.trans.XPathException: Unable to load the resource 
[classpath:https://localhost:8443/api/endpoint] using the thread context class loader or the current class's class loader
at net.sf.saxon.lib.StandardUnparsedTextResolver.resolve(StandardUnparsedTextResolver.java:184) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.functions.UnparsedTextFunction.readFile(UnparsedTextFunction.java:76) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.functions.UnparsedText.evalUnparsedText(UnparsedText.java:89) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.functions.UnparsedText.call(UnparsedText.java:43) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.functions.UnparsedText.call(UnparsedText.java:29) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.FunctionCall.iterate(FunctionCall.java:547) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.CardinalityChecker.evaluateItem(CardinalityChecker.java:280) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.parser.Evaluator$3.evaluate(Evaluator.java:73) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.parser.Evaluator$3.evaluate(Evaluator.java:70) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.SystemFunctionCall.evaluateArguments(SystemFunctionCall.java:434) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.FunctionCall.iterate(FunctionCall.java:545) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.instruct.CopyOf.processLeavingTail(CopyOf.java:557) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.instruct.Choose.processLeavingTail(Choose.java:880) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:699) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:687) ~[Saxon-HE-9.8.0-5.jar:na]
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:262) ~[Saxon-HE-9.8.0-5.jar:na]

似乎 xslt 解析器正试图通过在前面加上 classpath: 来从已经绝对的 URI 中构建绝对 URI

根据规范,

如果 URI 是相对 URI 引用,则它是相对于静态上下文中的 >static 基本 URI 属性解析的。

这显然不是我遇到的行为。

将函数调用放在最顶部的样式表中不是一种选择,因为我们计划将其用作标准实用程序样式表/库。

我目前正在使用 Saxon-HE 9.8.0-5

【问题讨论】:

  • 这是整个堆栈跟踪,包括所有“引起”部分吗?
  • 嗨@JimGarrison 我更新了堆栈跟踪,为问题提供了一些背景信息。我试图寻找“classpath:”前面的代码,而函数调用parse-json(unparsed-text($uri)) 把我带到了这里。看来罪魁祸首在UnparsedTextFunctionabsoluteURI = ResolveURI.makeAbsolute(href, baseURI);的第98行
  • 您在 XSLT 代码中使用的是 <xsl:import href="classpath:childthatbreaks.xslt" /> 吗?为什么不<xsl:import href="childthatbreaks.xslt" />
  • @MartinHonnen 如果我有一个外部模板存储库,我会这样做。但是此资源作为 Spring Boot 应用程序的一部分打包在 JAR 中。您的建议在这种情况下可行吗?
  • 我不太熟悉应该如何解析此类 URL,我想您必须等到 Saxonica 的 Michael Kay 回答您的问题。

标签: json xml xslt xpath saxon


【解决方案1】:

显示的堆栈跟踪来自对 unparsed-text() 函数的调用:这是因为 json-doc() 被实现为组合 unparsed-text() => parse-json()

我认为你是对的。 Saxon 特殊情况类路径:URI,因为它们是非标准的,并且没有被 java.net.URI 类正确处理,如果基本 URI 以“classpath:”开头,那么它会在提供的 URI 之前添加“classpath:”而不首先检查提供的 URI 是否是相对的。

您可以在

上跟踪此问题

https://saxonica.plan.io/issues/3518

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多