使用java XSLT Extensions的数组

我正在尝试使用java在XSLT Extensions中使用数组。

我收到以下错误:

Caused by: java.lang.ClassCastException: org.apache.xpath.objects.XObject cannot be cast to org.apache.xpath.objects.XNodeSet. 

我使用数组的方式是。 扩展类方法

 public static String[] getEvents(String contractIdStr,String tradeIdStr) { return new String[]{"MacroType","Type","SubType"}; } 

在XSL内部,

          

我正在使用XALAN Parse。

我不认为你可以让XPath函数返回一个字符串数组。 但是,您可以创建的是返回NodeSet的XPath XALAN扩展。 在您的情况下,您可能需要包含文本节点的节点集。 然后,您所要做的就是遍历节点集的所有节点,以检索您在扩展节点集中生成的所有字符串。
我已经重构了一些你的例子来说明我认为解决方案尽可能接近你想要的样子。 第一堂课是你的扩展。 正如我所说,它创建了一个节点集而不是字符串数组。 第二类有XSL。 这有点神秘,因为我需要在java中拥有一切(紧凑)才能使用eclipse java调试器(混合eclipse XSLT和java调试器是一个非首发)。

所以你去:首先是扩展名:

 package com.converter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import org.apache.xalan.extensions.ExpressionContext; import org.apache.xpath.NodeSet; import org.apache.xpath.objects.XNodeSet; import org.apache.xpath.objects.XNodeSetForDOM; import org.w3c.dom.Document; import org.w3c.dom.NodeList; public class Rules { public static XNodeSet getEvents(ExpressionContext context, String s1, String s2) throws TransformerException { XNodeSet result = null ; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance() ; DocumentBuilder dBuilder; dBuilder = dbf.newDocumentBuilder(); Document doc = dBuilder.newDocument(); NodeSet ns = new NodeSet(); ns.addNode( doc.createTextNode("MacroType" + s1 ) ) ; ns.addNode( doc.createTextNode("Type" + s2 ) ) ; ns.addNode( doc.createTextNode("SubType" + s1 + s2 ) ) ; result = new XNodeSetForDOM( (NodeList)ns, context.getXPathContext() ); } catch (ParserConfigurationException e) { e.printStackTrace(); } return result ; } } 

然后是测试类(带有嵌入式XSL)。

 import java.io.StringReader; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; public class Test { private static final String TESTXSL = " " + " " + "  " + "  " + "  " + " , " + "  " + "" ; public static void main(String[] args) throws Exception { new Test().run () ; } public void run () throws Exception { TransformerFactory transFact = TransformerFactory.newInstance( ); Source xsltSource = new StreamSource( new StringReader( TESTXSL ) ); Transformer xsl = transFact.newTransformer(xsltSource); Source src = new DOMSource () ; // unused anyway Result result = new StreamResult( System.out ) ; xsl.transform(src , result ); } } 

有了这两个类,输出就是

 MacroTypes1,Types2,SubTypes1s2 

同样,正如这个线程的其他XSLT VIP指出的那样,这个解决方案将把你绑定到Xalan Java版本2.6 + ……但问题的真相是:
1.没有扩展,XSLT 1.0通常是无用的。
2.每个处理器都有自己的方式(javascript用于MSXML,java用于Xalan,声明Xalan-C的入口点…)