Saxonica EE环境下能否忽略XSLT中xsl:value-of的select属性值?
在Saxonica EE中忽略XSLT xsl:value-of的select属性执行逻辑
针对你提到的场景——需要跳过xsl:value-of中调用外部应用逻辑的select属性执行,Saxonica EE提供了几种可行方案,按优先级推荐如下:
方案1:预处理样式表(无需修改原代码)
编写一个简单的XSLT样式表,对原样式表进行转换,将目标xsl:value-of元素的select属性替换为无副作用的表达式(比如空字符串''),从而跳过原逻辑执行。
示例预处理样式表:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cpi="http://your-cpi-namespace-uri"> <!-- 默认复制所有节点 --> <xsl:mode on-no-match="shallow-copy"/> <!-- 匹配调用cpi:setHeader的xsl:value-of元素,替换select为无副作用表达式 --> <xsl:template match="xsl:value-of[contains(@select, 'cpi:setHeader')]"> <xsl:value-of select="''"/> </xsl:template> </xsl:stylesheet>
使用时,先将原样式表作为输入传入这个预处理样式表,生成修改后的样式表,再用Saxonica执行修改后的版本即可。
方案2:通过Saxonica API拦截自定义函数(动态控制)
利用Saxonica EE的扩展函数机制,注册一个空实现的cpi:setHeader函数,替换原函数的执行逻辑。这种方式无需修改原样式表,适合需要动态开关逻辑的场景。
示例Java代码(基于Saxon API):
import net.sf.saxon.s9api.*; public class InterceptFunction { public static void main(String[] args) throws Exception { Processor processor = new Processor(true); // 初始化EE处理器 XsltCompiler compiler = processor.newXsltCompiler(); // 注册自定义函数替代原cpi:setHeader compiler.declareFunction(new ExtensionFunction() { @Override public QName getName() { return new QName("http://your-cpi-namespace-uri", "setHeader"); } @Override public SequenceType getResultType() { return SequenceType.EMPTY_SEQUENCE; } @Override public SequenceType[] getArgumentTypes() { return new SequenceType[]{ SequenceType.SINGLE_ITEM, SequenceType.SINGLE_STRING, SequenceType.SINGLE_STRING }; } @Override public XdmValue call(XdmValue[] arguments) { // 空实现,不执行任何外部逻辑 return XdmEmptySequence.getInstance(); } }); // 编译并执行原样式表 XsltExecutable executable = compiler.compile(new StreamSource("original-stylesheet.xsl")); XsltTransformer transformer = executable.load(); // 设置输入源与输出目标 transformer.setSource(new StreamSource("input.xml")); transformer.setDestination(new StreamResult(System.out)); transformer.transform(); } }
方案3:直接修改原样式表(最直接)
如果允许修改原XSLT代码,直接将目标xsl:value-of替换为无副作用的内容,或者注释掉原逻辑:
修改前:
<xsl:value-of select="cpi:setHeader($exchange, 'content-type', 'application/xml')"/>
修改后(二选一):
<!-- 注释掉原逻辑 --> <!-- <xsl:value-of select="cpi:setHeader($exchange, 'content-type', 'application/xml')"/> --> <!-- 替换为无副作用的空输出 --> <xsl:value-of select="''"/>
内容的提问来源于stack exchange,提问作者kantesh
相关产品推荐
相关产品推荐

