2011-03-29 26 views
8

Quiero transformar un XML con XSLT en Java. Para eso estoy usando el paquete javax.xml.transform. Sin embargo, obtengo la excepción javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet. Este es el código que estoy usando:Error de Java Transformer: no se pudo compilar la hoja de estilos

public static String transform(String XML, String XSLTRule) throws TransformerException { 

    Source xmlInput = new StreamSource(XML); 
    Source xslInput = new StreamSource(XSLTRule); 

    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    Transformer transformer = tFactory.newTransformer(xslInput); // this is the line that throws the exception 

    Result result = new StreamResult(); 
    transformer.transform(xmlInput, result); 

    return result.toString(); 
} 

Tenga en cuenta que he marcado la línea que arroja la excepción.

Cuando entro en el método, el valor de XSLTRule es la siguiente:

<xsl:stylesheet version='1.0' 
xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
xmlns:msxsl='urn:schemas-microsoft-com:xslt' 
exclude-result-prefixes='msxsl' 
xmlns:ns='http://www.ibm.com/wsla'> 
    <xsl:strip-space elements='*'/> 
    <xsl:output method='xml' indent='yes'/> 
    <xsl:template match='@* | node()'> 
     <xsl:copy> 
      <xsl:apply-templates select='@* | node()'/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/ns:SLA 
          /ns:ServiceDefinition 
           /ns:WSDLSOAPOperation 
            /ns:SLAParameter[@name='Performance']"/> 
</xsl:stylesheet> 
+0

¿Qué excepción captó? –

+0

Es 'javax.xml.transform.TransformerConfigurationException'. Edité mi publicación original, está allí ahora. – Ivan

+0

¿Por qué su última plantilla está vacía? – Stephan

Respuesta

9

El constructor

public StreamSource(String systemId) 

construir un StreamSource desde una URL. Creo que estás pasando el contenido del XSLT en su lugar. Prueba esto:

File xslFile = new File("path/to/your/xslt"); 
TransformerFactory factory = TransformerFactory.newInstance(); 
Templates xsl = factory.newTemplates(new StreamSource(xslFile)); 

También debe establecer la OutputStream que su StreamResult se escribe a:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
Result result = new StreamResult(baos); 
transformer.transform(xmlInput, result); 
return baos.toString(); 
+3

Alternativamente, simplemente cambie 'nuevo StreamSource (XSLTRule)' a 'nuevo StreamSource (nuevo StringReader (XSLTRule))' –

+0

¡muchas gracias! pero todavía tengo un problema con el 'Result result = new StreamResult();'. ¿Lo que debe hacer allí? – Ivan

+0

@Ivan: ¿qué problema tiene con 'Result result = new StreamResult();'? – MarcoS

1

Tendrá que contruct una corriente de la cadena XSLT que tiene y luego usarlo como la corriente fuente

InputStream xslStream = new ByteArrayInputStream(XSLTRule.getBytes("UTF-8")); 
Source xslInput = new StreamSource(xslStream); 

para obtener el resultado en una cadena:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    Result result = new StreamResult(bos); 
    transformer.transform(xmlInput, result); 
    String s = new String(bos.toByteArray()); 
    System.out.println(s); 
+0

muchas gracias! pero todavía tengo un problema con el 'Result result = new StreamResult();'. ¿Lo que debe hacer allí? – Ivan

+0

He agregado ese código a la respuesta. – Nishan

0

Para usar XSLTC, ponga xalan.jar (2.5), serializer.jar, xml-apis.jar y xercesImpl.jar en su classpath.

+0

No hagas esto. Todos esos paquetes (del proyecto Xerces) han sido abandonados desde 2010. El código ahora vive en la JVM. – Lambart

Cuestiones relacionadas