我正在使用在 Python 3.11.5 中使用 pip 安装的 saxonche 版本 12.3.0。
在 XSLT 中使用
collection()
时,document-uri()
似乎不起作用。
我创建了一个小测试:
Python
import saxonche
with saxonche.PySaxonProcessor(license=False) as proc:
xsltproc = proc.new_xslt30_processor()
executable = xsltproc.compile_stylesheet(stylesheet_file="test.xsl")
content = executable.call_template_returning_string()
print(f"\ncontent:\n{content}")
XSLT 3.0(测试.xsl)
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" expand-text="yes">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template name="xsl:initial-template">
<xsl:for-each select="collection('input?select=*.(xml|XML)&content-type=application/xml')">
<xsl:message>Processing "{document-uri()}"...</xsl:message>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出
Processing ""...
Processing ""...
Processing ""...
content:
<doc>First test XML instance.</doc>
<doc>Second test XML instance.</doc>
<doc>Third test XML instance.</doc>
预期输出
Processing "file:/C:/test_saxonche_collection/input/test_01.xml"...
Processing "file:/C:/test_saxonche_collection/input/test_02.xml"...
Processing "file:/C:/test_saxonche_collection/input/test_03.xml"...
content:
<doc>First test XML instance.</doc>
<doc>Second test XML instance.</doc>
<doc>Third test XML instance.</doc>
这是 Saxon 中的错误吗?
这不是 Saxon 中的错误。
问题是,默认情况下,集合不稳定,使用
collection()
读取的文档仅在集合稳定时才会添加到文档池中。
来自文档:
当且仅当集合稳定时,使用 collection() 函数读取的文档才会添加到文档池(因此具有 document-uri() 属性)。
我能够通过两种不同的方式解决这个问题。
第一个是将
stable=yes
查询参数添加到我的 collection()
调用中:
collection('input?select=*.(xml|XML)&content-type=application/xml&stable=yes')
第二个是使用
base-uri()
代替 document-uri()
:
<xsl:message>Processing "{base-uri()}"...</xsl:message>
我将坚持使用
base-uri()
,因为存在使集合稳定的性能问题。 (根据上面链接的文档。)
附加信息