考虑一个简单的类:
using org.apache.xalan.extensions;
namespace Foo
{
public static class Extension
{
public static string Bar(ExpressionContext context, string baz)
{
return "Hello, world!";
}
}
}
这就是我尝试使用它的方式:
using javax.xml.transform;
using javax.xml.transform.stream;
public static class Program
{
static void Main()
{
TransformerFactory transformerFactory = new com.sun.org.apache.xalan.@internal.xsltc.trax.TransformerFactoryImpl();
java.lang.Thread.currentThread().setContextClassLoader(new ikvm.runtime.AppDomainAssemblyClassLoader(typeof(Program).Assembly));
Transformer t = transformerFactory.newTransformer(new StreamSource("transform.xslt"));
t.transform(new StreamSource("doc.xml"), new StreamResult(java.lang.System.@out));
}
}
输入文件:
<?xml version="1.0" encoding="utf-8" ?>
<root />
转型:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="xalan://cli.Foo.Extension">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:value-of select="foo:Bar('baz')" />
</xsl:template>
</xsl:stylesheet>
但最后我得到了这个错误:
错误:'找不到外部方法'cli.Foo.Extension.bar'(必须是公共的)。' 致命错误:“无法编译样式表”
同时,调用java.lang.Class.forName("cli.Foo.Extension").getMethods()
找到所需的方法。怎么了?
第一个问题是代码同时使用了两个不同的Xalans:一个内置在标准库中(package
com.sun.org.apache.xalan
),第二个单独安装(packageorg.apache.xalan
)。它们具有ExpressionContext
彼此不兼容的不同接口。第二个问题是代码使用了 XSLTC(Xalan 的编译版本),它还没有(?)被教导识别
ExpressionContext
. 您需要使用解释版本。这是可以工作的代码: