我正在将一个简单的字符串参数传递给我的Saxon驱动的XSLT,但是没有被使用。
这是XSL(min.xsl
):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<xsl:param name="in"/>
<Out>
<xsl:choose>
<xsl:when test="Val = $in">match!</xsl:when>
<xsl:otherwise>
<xsl:value-of select="Val"/> != <xsl:value-of select="$in"/>
</xsl:otherwise>
</xsl:choose>
</Out>
</xsl:template>
</xsl:stylesheet>
这是用于调用XSLT的代码:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.FileInputStream;
import java.io.StringReader;
public class MinXSLT {
public static void main(String[] args) throws Exception {
try {
Class.forName("net.sf.saxon.TransformerFactoryImpl");
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
System.out.println("Plugged in Saxon");
} catch (ClassNotFoundException ignore) {}
final TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer e = transformerFactory.newTemplates(new StreamSource(new FileInputStream("src/test/resources/min.xsl"))).newTransformer();
e.setParameter("in", "x");
e.transform(new StreamSource(new StringReader("<Val>x</Val>")), new StreamResult(System.out));
}
}
这dependencies
是我的部分pom.xml
:
<dependencies>
<dependency>
<groupId>saxon</groupId>
<artifactId>saxon-he</artifactId>
<version>9.2</version>
</dependency>
</dependencies>
是的,只是saxon-he
。
奇怪的是,当我删除Saxon依赖项时,该参数被拾取,并且得到了预期的结果:
<?xml version="1.0" encoding="UTF-8"?><Out>match!</Out>
但是,当使用Saxon时,我得到的“参数不匹配”结果是用空字符串代替参数值:
Plugged in Saxon
<?xml version="1.0" encoding="UTF-8"?><Out>x != </Out>
我的罪行是什么?
作为记录,我尝试使用较新版本的Saxon(net.sf.saxon:Saxon-HE:9.7.x
等),结果相同。但是,在实际项目中,我会坚持saxon:saxon-he:9.2
下去,因此升级并不是一个真正的选择。
您需要将<xsl:param name="in"/>
任何对象移到外部,xsl:template
以将其作为可以在转换之前设置的全局参数。xsl:param
内部模板不能由JAXP转换API设置,在具有Saxon API的XSLT 3中,您可以直接调用命名模板或函数并设置其参数,但是在JAXP中将模板应用于Source的方法并不适用于此。 。只需使用全局参数,即可将xsl:param
任何参数移到外部,xsl:template
并使其成为的子级xsl:stylesheet/xsl:transform
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句