微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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,但无论如何我已经在做这两个单独的“主要”。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。