当我运行我的xsl样式表时,我需要知道是否存在一些文件。因为xslt没有本地方法来测试文件是否存在(ASFAIK),所以我想用javascript来做这件事。通常我使用saxon 9 HE,但是一些同事告诉我HE版本不支持javascript函数。有没有一种方法可以用saxon 9 HE执行java脚本函数?
我尝试过这个例子:如何在xslt中包含javaScript文件,但oxygen给了我一个错误:“找不到匹配的名为的单参数函数”。
再次感谢马丁,你真的帮了我大忙!我用集成扩展函数功能编写了自己的自定义xslt函数。该函数调用java方法,该方法测试文件是否存在于给定目录中,并返回true或false。对于那些需要“集成扩展函数”功能的工作示例,或者甚至想测试文件是否存在于saxon-9-HE中的人,我将分享我的简单解决方案。
Java类,定义xslt函数名、参数和返回类型,并在调用xslt函数时包含要调用的Java方法:
package de.mypackage.xsltfunctions;
import java.io.File;
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.BooleanValue;
import net.sf.saxon.value.SequenceType;
import net.sf.saxon.value.StringValue;
public class FileExists extends ExtensionFunctionDefinition {
@Override
public StructuredQName getFunctionQName() {
return new StructuredQName("file", "http://mydomain.de/xslt/filesystem", "file-exists");
}
@Override
public SequenceType[] getArgumentTypes() {
return new SequenceType[] { SequenceType.SINGLE_STRING, SequenceType.SINGLE_STRING };
}
@Override
public SequenceType getResultType(final SequenceType[] suppliedArgumentTypes) {
return SequenceType.SINGLE_BOOLEAN;
}
@Override
public ExtensionFunctionCall makeCallExpression() {
return new ExtensionFunctionCall() {
@Override
public Sequence call(final XPathContext context, final Sequence[] arguments)
throws XPathException {
String searchDir = ((StringValue) arguments[0]).getStringValue();
String fileName = ((StringValue) arguments[1]).getStringValue();
if (!new File(searchDir).isDirectory()) {
throw new XPathException(
"First argument \"" + searchDir + "\" is not a directory or cannot be found!");
}
return BooleanValue.get(new File(searchDir + fileName).exists());
}
};
}
}
为saxon处理器注册自定义xslt函数的代码被截断:
import java.io.StringWriter;
import de.mypackage.xsltfunctions.FileExists;
import net.sf.saxon.TransformerFactoryImpl;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
StringWriter xmlResultResource = new StringWriter();
System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl");
TransformerFactory factory = TransformerFactory.newInstance();
TransformerFactoryImpl tFactoryImpl = (TransformerFactoryImpl) factory;
net.sf.saxon.Configuration saxonConfig = tFactoryImpl.getConfiguration();
saxonConfig.registerExtensionFunction(new FileExists());
Transformer transformer = factory.newTransformer(new StreamSource(getXslFile()));
transformer.transform(new StreamSource(xmlFileInput), new StreamResult(xmlResultResource));
String result = xmlResultResource.getBuffer().toString();
您可以使用XPath函数doc available
https://www.w3.org/TR/xpath-functions/#func-文档可用,未解析文本可用
https://www.w3.org/TR/xpath-functions/#func-未分析文本可用于检查是否存在XML文档或非XML文本文档。
Saxon 9不支持使用Javascript(简单的ECMAScript/Javascript引擎通常不包含任何文件IO功能),但有一个称为集成扩展函数的功能http://saxonica.com/html/documentation/extensibility/integratedfunctions/可以在Saxon 9(所有版本)中调用Java代码。在Saxon 9 PE和EE中,还可以使用自反扩展函数直接从XSLT代码调用Java代码。
例如: 除了“,:”之外,我还想去掉“and”这个词。请建议。
本文向大家介绍JavaScript中的函数嵌套使用,包括了JavaScript中的函数嵌套使用的使用技巧和注意事项,需要的朋友参考一下 在JavaScript1.2之前,函数定义是只允许在顶层全局代码,但1.2的JavaScript可以嵌套函数定义其他函数中也是可以的。 仍然存在的函数定义可以循环或条件之内不会出现限制。在函数定义这些限制只适用于函数声明与函数语句。 函数文本(在JavaScri
本文向大家介绍JavaScript中Function()函数的使用教程,包括了JavaScript中Function()函数的使用教程的使用技巧和注意事项,需要的朋友参考一下 function语句不是定义一个新的函数,并且可以定义你的函数动态使用Function()构造使用操作符的唯一途径。 注:这是面向对象编程的术语。第一次可能会感觉不太习惯,这里是没有问题的。 语法 下面是使用new运算符创
本文向大家介绍JavaScript中的ubound函数使用实例,包括了JavaScript中的ubound函数使用实例的使用技巧和注意事项,需要的朋友参考一下 JavaScript中ubound函数方法是返回在 VBArray 的指定维中所使用的最大索引值。使用方法: 其中safeArray是必选项。是一个 VBArray 对象。 dimension是可选项。要获知其索引上界的 VBArray 的
问题内容: 我有一系列XML文件,这些文件引用XSLT文件以在浏览器中呈现为HTML。其中一些链接会在常规页面上执行AJAX调用以请求HTML,并将其插入页面上已有的DIV中。 我想做的是从该页面调用链接的Web服务,然后接收XML,然后以与原始页面相同的方式将其处理为HTML,然后通过AJAX插入当前页面的DIV中。 我的问题是:我将如何获取Javascript下载的XML并使用Javascri
我有一个xslt文档。我想在这个文档中使用if语句。我的代码是: 如果返回的值是code1然后写A,如果返回的值是code2然后写B。 我该怎么做?