如何在Saxon HE 12的XSL流水线中传递参数?
问题原因
你用错了transform函数的参数传递方式:parameters字段是给样式表全局参数(也就是<xsl:stylesheet>下定义的<xsl:param>)传值的,而你的child.xsl里,docType和debugCheck是初始模板main的局部参数,所以用parameters根本传不过去。
解决方案
两种办法任选:
办法一:把模板参数改成全局参数
修改child.xsl,把模板里的局部参数移到样式表级别:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 改成全局参数 --> <xsl:param name="docType"/> <xsl:param name="debugCheck"/> <xsl:template name="main"> <xsl:message select="'[CHILD] docType: ', $docType"/> <xsl:message select="'[CHILD] debugCheck: ', $debugCheck"/> <result docType="{$docType}" debugCheck="{$debugCheck}"/> </xsl:template> </xsl:stylesheet>
pipeline.xsl不用改,执行原命令就能正常传参。
办法二:用initial-template-parameters传模板局部参数
如果不想改child.xsl,就修改pipeline.xsl里的runtime变量,把parameters换成initial-template-parameters——这个字段是专门给初始模板传局部参数的:
<xsl:variable name="runtime" select="map { 'stylesheet-location': 'child.xsl', 'source-node': ., 'initial-template': QName('', 'main'), 'initial-template-parameters': map { 'docType': $docType, 'debugCheck': 'from-pipeline' } }"/>
child.xsl保持原样,参数就能正确传递到模板里。
验证结果
执行原命令:
java -jar "saxon-he-12.8.jar" -xsl:pipeline.xsl -s:input.xml -o:output.xml docType=test
会看到正确的日志输出:
[PIPELINE] docType param: test [CHILD] docType: test [CHILD] debugCheck: from-pipeline
生成的output.xml也会有正确的参数值:
<?xml version="1.0" encoding="UTF-8"?> <result docType="test" debugCheck="from-pipeline"/>
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

