如何解决在 Saxon/C 中使用条件包含/静态参数?
我正在尝试在 Saxon/C HE 中使用 XSLT 条件包含/静态参数,但出现以下错误:
Error
Parameter $some_param cannot be supplied dynamically because it is declared as static
为了重现,我使用了几年前添加的几个答案中的示例。 (Here 和 here。)
在这两个答案中,我从命令行使用了 Saxon-HE 的 java 9.7 版,没有问题。我还从命令行使用 HE 的 Java 10.5 版再次进行了测试。再次没有问题。
但是,如果我尝试使用运行 Saxon-HE 9.9.1.5C 的 Saxon/C 1.2.1 从 Python (3.8) 运行此示例,则会出现上述错误。
有没有其他人有使用 XSLT 3.0 和 Saxon/C(尤其是 Python)中的静态参数的经验,可以提供指导?
测试代码...
XML 输入 (test.xml)
<doc>
<foo/>
</doc>
Python
import saxonc
saxon_proc = saxonc.PySaxonProcessor(license=False)
print(f"Processor version: {saxon_proc.version}")
xsltproc = saxon_proc.new_xslt30_processor()
# noinspection PyArgumentList
xsltproc.set_parameter("inc2",saxon_proc.make_boolean_value(True))
results = xsltproc.transform_to_string(source_file="test.xml",stylesheet_file="test_main.xsl")
if results:
print(results)
saxon_proc.release()
主 XSLT 3.0 (test_main.xsl)
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="inc1" as="xs:boolean" select="false()"
static="yes" required="no"/>
<xsl:param name="inc2" as="xs:boolean" select="false()"
static="yes" required="no"/>
<xsl:include href="test_inc1.xsl" use-when="$inc1"/>
<xsl:include href="test_inc2.xsl" use-when="$inc2"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
第一个可能包含的 XSLT 3.0 (test_inc1.xsl)
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="foo">
<xsl:copy>INCLUDE FILE 1!!!</xsl:copy>
</xsl:template>
</xsl:stylesheet>
第二个可能包含的 XSLT 3.0 (test_inc2.xsl)
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="foo">
<xsl:copy>INCLUDE FILE 2!!!</xsl:copy>
</xsl:template>
</xsl:stylesheet>
预期输出(这是我从命令行使用 java Saxon-HE 得到的结果(如下所示))
<doc>
<foo>INCLUDE FILE 2!!!</foo>
</doc>
实际输出
Processor version: Saxon/C 1.2.1 running with Saxon-HE 9.9.1.5C from Saxonica
Error
Parameter $inc2 cannot be supplied dynamically because it is declared as static
工作命令行:
java -cp "saxon-he-10.5.jar" net.sf.saxon.Transform -s:"test.xml" -xsl:"test_main2.xsl" inc2="true"
我还应该注意,在尝试使用 shadow 属性时我遇到了同样的错误(命令行仍然可以使用命令行参数 inc_number="2"
):
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="inc_number" as="xs:string" select="'1'" static="yes" required="no"/>
<xsl:include _href="test_inc{$inc_number}.xsl"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
解决方法
来自@ond1 (O'Neil Delpratt - Saxonica)...
您好,很遗憾,目前无法设置静态 当前版本中的参数,但我添加了此功能 将在下一个版本中提供。
因此,在支持设置静态参数之前,我将使用两个不同的“主”XSLT;每个都包括所需的样式表。另一种选择是在执行之前转换 XSLT,但无论如何我已经在做这两个单独的“主要”。
此外,一旦支持设置静态参数,我将使用完整的工作示例更新此答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。