使用 collection() 时 document-uri() 不起作用

问题描述 投票:0回答:1

我正在使用在 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)&amp;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 中的错误吗?

xml xpath xslt saxon saxon-c
1个回答
1
投票

这不是 Saxon 中的错误。

问题是,默认情况下,集合不稳定,使用

collection()
读取的文档仅在集合稳定时才会添加到文档池中。

来自文档

当且仅当集合稳定时,使用 collection() 函数读取的文档才会添加到文档池(因此具有 document-uri() 属性)。

我能够通过两种不同的方式解决这个问题。

第一个是将

stable=yes
查询参数添加到我的
collection()
调用中:

collection('input?select=*.(xml|XML)&amp;content-type=application/xml&amp;stable=yes')

第二个是使用

base-uri()
代替
document-uri()
:

<xsl:message>Processing "{base-uri()}"...</xsl:message>

我将坚持使用

base-uri()
,因为存在使集合稳定的性能问题。 (根据上面链接的文档。)

附加信息

© www.soinside.com 2019 - 2024. All rights reserved.