编译样式表时的未知函数 saxon:parse-html
Posted
技术标签:
【中文标题】编译样式表时的未知函数 saxon:parse-html【英文标题】:Unknown function saxon:parse-html when compiling stylesheet 【发布时间】:2021-08-25 13:30:42 【问题描述】:我正在使用 Saxon-EE 10.3 转换器对 Oxygen 进行 XSL 转换。我想稍后在我的网站上使用已编译的样式表 (sef.json) 和 Saxon-JS 2。 在 XSL 转换中,我使用 saxon:parse-html 函数,其 saxon 命名空间声明如下:
<xsl:stylesheet xmlns:prop="http://saxonica.com/ns/html-property"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:style="http://saxonica.com/ns/html-style-property"
xmlns:saxon="http://saxon.sf.net/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT"
xmlns:js="http://saxonica.com/ns/globalJS"
exclude-result-prefixes="xs prop ixsl js style saxon xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xpath-default-namespace="http://www.tei-c.org/ns/1.0"
xmlns="http://www.tei-c.org/ns/1.0">
函数是这样调用的:
<xsl:call-template name="nameTemplate">
<xsl:with-param name="html">
<xsl:copy-of select="saxon:parse-html(var)"></xsl:copy-of>
</xsl:with-param>
</xsl:call-template>
我尝试通过这个命令编译样式表:
xslt3 -xsl:test.xsl -export:test.sef.json -t
但我遇到以下错误:
Failed to compile stylesheet: Static error in XPath on line 147 in Oxygen/Test.xsl saxon:parse-html(?Text): Unknown function Qhttp://saxon.sf.net/parse-html()
Error Qhttp://www.w3.org/2005/xqt-errorsXPST0017 at xpath.xsl#963
Failed to compile stylesheet
Error Qhttp://www.w3.org/2005/xqt-errorsXPST0017 at xpath.xsl#963
Static error in XPath on line 147 in Oxygen/Test.xsl saxon:parse-html(?Text): Unknown function Qhttp://saxon.sf.net/parse-html()
不过,在 Oxygen 中转换没有问题。
【问题讨论】:
使用 oXygen,您可以使用 Saxon 的 Java 版本,它在 PE 和 EE 版本中提供了扩展功能saxon:parse-html
。对于xslt3
,您使用的是 Saxon 的 javascript/Node.js 版本,这是一种不同的产品,据我所知,它不支持该扩展功能。我不知道如果您尝试在 oXygen 和目标 JS 中使用 Saxon Java EE 进行编译会发生什么。至于解决方法,如果您的目标是解析 XSLT 中的 HTML 字符串,您可以尝试使用 David Carlisle 的纯 XSLT 2 HTML 解析器,或者您可以尝试调用 JavaScript。
感谢您的信息!我用 Saxon 10.3 在 oXygen 中编译它,它确实产生了 sef.json 输出。但是,当我尝试在 Javascript 函数SaxonJS.transform(stylesheetLocation: "oxygenOutput.sef.json", …)
中重用它时,出现了同样的错误:Object message: "Unknown function local name parse-html" ...
。如果我无法使用 parse-html 进行管理,我将查找这些其他解决方案。
Martin 是正确的(一如既往):该函数在 Java 产品中可用,但在 Javascript 产品中不可用。在 Java 下编译以在 Javascript 下执行时,我们还有一些工作要做来管理这些差异。
【参考方案1】:
您可能需要调用 JavaScript,例如设置一个script
元素
<script>
function parseHTML(html) return new DOMParser().parseFromString(html, 'text/html');
</script>
在您的 HTML 文档中,然后在浏览器中使用 Saxon JS 2 的 XSLT 中,您应该可以使用例如
ixsl:window() => ixsl:get('parseHTML') => ixsl:apply([var])
而不是saxon:parse-html(var)
,在您的XSLT 中使用xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT"
的命名空间声明。
除了 XSLT 代码之外,另一种不需要您设置脚本代码的方法是使用 ixsl:eval
在 Saxon-JS 2 中直接从 XSLT 运行 JavaScript;我在https://martin-honnen.github.io/saxon-js-parse-html-test/html/test-saxon-parse-html2.html 设置了一个示例,它基本上使用了一个实现
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:saxon="http://saxon.sf.net/"
xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:function name="saxon:parse-html" as="document-node()" use-when="system-property('xsl:product-name') = 'Saxon-JS'">
<xsl:param name="html" as="xs:string"/>
<xsl:sequence select="ixsl:eval('new DOMParser()') => ixsl:call('parseFromString', [$html, 'text/html'])"/>
</xsl:function>
</xsl:stylesheet>
XSLT 3 模块https://github.com/martin-honnen/saxon-js-parse-html-test/blob/master/xslt/override-saxon-parse-html2.xsl。
您可以在您的其他 XSLT 代码中使用 xsl:import
,就像在 https://github.com/martin-honnen/saxon-js-parse-html-test/blob/master/xslt/test-override-saxon-parse.xsl 中所做的那样,例如<xsl:import href="override-saxon-parse-html2.xsl"/>
并致电例如saxon:parse-html(.)
.
我设法将该代码编译为具有设置 xslt3 -xsl:test-override-saxon-parse.xsl -nogo -export:test-override-saxon-parse. -sef.json -ns:"##html5"
的 SEF 文件,这样 HTML 页面 https://martin-honnen.github.io/saxon-js-parse-html-test/html/test-saxon-parse-html2.html 可以简单地运行该 XSLT
SaxonJS.transform(
stylesheetLocation: '../xslt/test-override-saxon-parse.sef.json',
sourceLocation: '../xml/sample2.xml',
destination: 'appendToBody'
, 'async')
作为替代方案,您可以将 David Carlisle 在 GitHub 上某处的纯 XSLT 2 HTML 解析器导入到您的 XSLT 代码中。
【讨论】:
以上是关于编译样式表时的未知函数 saxon:parse-html的主要内容,如果未能解决你的问题,请参考以下文章
“java.sql.SQLSyntaxErrorException:'on 子句'中的未知列'*'”在休眠条件下加入表时