Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Xalan扩展函数实现中计算XPath表达式?_Java_Xml_Xslt_Xpath_Xalan - Fatal编程技术网

Java 如何在Xalan扩展函数实现中计算XPath表达式?

Java 如何在Xalan扩展函数实现中计算XPath表达式?,java,xml,xslt,xpath,xalan,Java,Xml,Xslt,Xpath,Xalan,我试图在Xalan 2.7.1提供给扩展函数的上下文中计算XPath表达式。由于某些原因,在Xalan中出现内部异常时,此操作总是失败 注意:您需要在类路径中输入以运行此操作 package org.example; 导入java.io.*; 导入java.util.*; 导入java.util.logging.*; 导入javax.xml.namespace.NamespaceContext; 导入javax.xml.transform.*; 导入javax.xml.transform.str

我试图在Xalan 2.7.1提供给扩展函数的上下文中计算XPath表达式。由于某些原因,在Xalan中出现内部异常时,此操作总是失败

注意:您需要在类路径中输入以运行此操作

package org.example;
导入java.io.*;
导入java.util.*;
导入java.util.logging.*;
导入javax.xml.namespace.NamespaceContext;
导入javax.xml.transform.*;
导入javax.xml.transform.stream.*;
导入javax.xml.xpath.*;
导入org.w3c.dom.*;
导入org.w3c.dom.traversal.NodeIterator;
导入org.apache.xalan.extensions.ExpressionContext;
公共类扩展{
公共静态最终字符串NS=“org:example:foo”;
公共静态最终字符串XSLT=“”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“测试:结果:\n”+
“\n”+
“\n”+
“\n”+
"";
公共静态最终字符串XML=“”+
“\n”+
“\n”+
“1\n”+
“2\n”+
“3\n”+
“./foo:a 5\n”+
"";
私有变压器厂xalanTransFact;
公共XalanExtension(){
xalanTransFact=new org.apache.xalan.processor.TransformerFactoryImpl();
}
公共空间转换(){
试一试{
弦乐作家;
writer=新的StringWriter();
System.out.println(org.apache.xalan.Version.getVersion());
Transformer Transformer=XalantTransformact.newTransformer(新StreamSource(新StringReader(XSLT));
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
transformer.setOutputProperty(OutputKeys.METHOD,“text”);
transformer.setOutputProperty(OutputKeys.ENCODING,“utf-8”);
变形金刚(
新StreamSource(新StringReader(XML)),
新的StreamResult(writer));
System.out.println(writer.toString());
}捕获(TransformerConfiguration异常ex){
Logger.getLogger(XalanExtension.class.getName()).log(Level.SEVERE,null,ex);
}捕获(TransformerException ex){
Logger.getLogger(XalanExtension.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共静态void main(字符串[]args){
XalanExtension实例=新的XalanExtension();
transform();
}
公共静态最终节点列表求值(ExpressionContext ctx、节点编辑器节点){
//文档顺序中的第一个节点
Node=nodes.nextNode();
if(node!=null&&node.hasChildNodes(){
试一试{
字符串xpathExpression=node.getFirstChild().getNodeValue();
XPathFactory XPathFactory=XPathFactory.newInstance();
XPath=xpathFactory.newXPath();
setNamespaceContext(新的NamespaceContext(){
@凌驾
公共字符串getNamespaceURI(字符串前缀){
if(“foo.”等于(前缀)){
返回NS;
}
返回null;
}
@凌驾
公共字符串getPrefix(字符串名称空间URI){
if(NS.equals(namespaceURI)){
返回“foo”;
}
返回null;
}
@凌驾
公共迭代器getPrefixes(字符串名称空间URI){
返回null;
}
});
return(NodeList)xpath.evaluate(xpathExpression,ctx.getContextNode(),XPathConstants.NODESET);
}catch(XPathExpressionException-ex){
Logger.getLogger(XalanExtension.class.getName()).log(Level.SEVERE,“xpath评估失败”,ex);
}
}
返回null;
}
}
扩展函数在
org.example.XalanExtension.evaluate(ExpressionContext,NodeIterator)
中实现。它确实被Xalan调用,但是我使用的XPath求值代码不起作用。程序只需查找一个具有已知值的特定元素,该值实际上是要在其出现的上下文中计算的XPath表达式

我从程序中获得以下输出:

XalanJava2.7.1 2017年1月31日下午3:09:10 org.example.xalan 严重:xpath计算失败 javax.xml.transform.TransformerException:XPath中存在未知错误。 位于org.apache.xpath.xpath.execute(xpath.java:365) 位于org.apache.xpath.xpath.execute(xpath.java:303) 位于org.apache.xpath.jaxp.XPathImpl.eval(XPathImpl.java:216) 位于org.apache.xpath.jaxp.XPathImpl.evaluate(XPathImpl.java:281) 位于org.example.XalanExtension.evaluate(XalanExtension.java:116) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于org.apache.xalan.extensions.ExtensionHandlerJavaClass.callFunction(ExtensionHandlerJavaClass.java:367) 位于org.apache.xalan.extensions.ExtensionHandlerJavaClass.callFunction(ExtensionHandlerJavaClass.java:440) 位于org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:222) 位于org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:473) 位于org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:208) 位于org.apache.xpath.xpath.execute(xpath.java:337) 位于org.apache.xalan.templates.ElemVariable.getValue(ElemVariable.java:280) 位于org.apache.xalan.templates.ElemVariable.execute(ElemVariable.java:248) 位于org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyT