首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXP与XSD导入ArrayIndexOutOfBoundsException

JAXP与XSD导入ArrayIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2013-09-17 13:11:53
回答 1查看 387关注 0票数 1

我面临着JDK ( 1.6和1.7) XSLT转换的问题。问题是,我希望用XSLT转换来处理使用xsd:import为其XSD (位于相同位置)的简单WSDL。

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    InputStream xmlStream = new FileInputStream("/home/d1x/temp/xslt/test.wsdl");
    String xmlSystemId = "file:///home/d1x/temp/xslt/test.wsdl";

    InputStream xsltStream = XsltTransformation.class.getResourceAsStream("wsdl-viewer.xsl");
    OutputStream outputStream = new FileOutputStream("/home/d1x/temp/xslt/output.html");
    new XsltTransformation().transform(xmlStream, xmlSystemId, xsltStream, outputStream);

}

public void transform(InputStream xmlStream, String xmlSystemId, InputStream xsltStream, OutputStream outputStream) {
    Source xmlSource = new StreamSource(xmlStream, xmlSystemId);
    Source xsltSource = new StreamSource(xsltStream);

    TransformerFactory transFact = TransformerFactory.newInstance();
    try {
        Transformer trans = transFact.newTransformer(xsltSource);
        trans.transform(xmlSource, new StreamResult(outputStream));
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }
}

当我运行我的代码时,我会得到一个很难调试的异常。当我移除导入时,一切都正常。

代码语言:javascript
复制
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at com.sun.org.apache.xml.internal.utils.SuballocatedIntVector.elementAt(SuballocatedIntVector.java:438)
at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase._firstch(DTMDefaultBase.java:524)
at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl.access$200(SAXImpl.java:76)
at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl$NamespaceChildrenIterator.next(SAXImpl.java:1433)
at com.sun.org.apache.xalan.internal.xsltc.dom.StepIterator.next(StepIterator.java:111)
at com.sun.org.apache.xalan.internal.xsltc.dom.StepIterator.next(StepIterator.java:111)
at com.sun.org.apache.xalan.internal.xsltc.dom.DupFilterIterator.setStartNode(DupFilterIterator.java:96)
at com.sun.org.apache.xalan.internal.xsltc.dom.UnionIterator$LookAheadIterator.setStartNode(UnionIterator.java:78)
at com.sun.org.apache.xalan.internal.xsltc.dom.MultiValuedNodeHeapIterator.setStartNode(MultiValuedNodeHeapIterator.java:212)
at com.sun.org.apache.xalan.internal.xsltc.dom.CurrentNodeListIterator.setStartNode(CurrentNodeListIterator.java:153)
at com.sun.org.apache.xalan.internal.xsltc.dom.CachedNodeListIterator.setStartNode(CachedNodeListIterator.java:55)
at GregorSamsa.topLevel()
... etc...

WSDL本身非常简单,并且正在使用导入:

代码语言:javascript
复制
...<types>
<xsd:schema>
  <xsd:import namespace="http://mytest.com" schemaLocation="test.xsd"/>
</xsd:schema>
</types>...

使用的XSLT可以在:http://tomi.vanek.sk/xml/wsdl-viewer.xsl中找到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 11:19:23

通过切换到JAXP的Saxon实现而不是内置的Java实现,我成功地解决了这个问题。唯一的代码更改是:

代码语言:javascript
复制
TransformerFactory transFact = net.sf.saxon.TransformerFactoryImpl.newInstance();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18850845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档