在 Saxon/C 中使用条件包含/静态参数?

问题描述

我正在尝试在 Saxon/C HE 中使用 XSLT 条件包含/静态参数,但出现以下错误

Error 
  Parameter $some_param cannot be supplied dynamically because it is declared as static

为了重现,我使用了几年前添加的几个答案中的示例。 (Herehere。)

在这两个答案中,我从命令行使用了 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,但无论如何我已经在做这两个单独的“主要”。

此外,一旦支持设置静态参数,我将使用完整的工作示例更新此答案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...