Modo efficace per trasformare un paio di nodi contenuti del feed
Domanda
- Ho bisogno di "proxy" di un feed
- e lasciare la maggior parte dei nodi incontaminata
- e di trasformare il contenuto di alcuni noti nodi chiamando alcuni dei metodi in java
- e tornare la trasformata di alimentazione
Naturalmente preferisco evitare - il caricamento in memoria l'intero feed - trasformare altri nodi - le cattive prestazioni
E ' una sorta di java tubo !
Grazie per i vostri consigli
Soluzione
Questo è qualcosa che io uso:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.dom.DOMResult;
import org.w3c.dom.Document;
...
TransformerFactory mTransformFactory = TransformerFactory.newInstance();
cTransformer = mTransformFactory.newTransformer(new StreamSource(new StringReader(StringUtil.readFromResource("/foo.xslt"))));
Document mResultDoc = XmlUtil.createDocument();
Document mResultDoc = XmlUtil.parseXmlFile("foo.xml");
transformer.transform(new DOMSource(source), new DOMResult(mResultDoc));
Dal momento che si vuole evitare il sovraccarico di memoria si dovrebbe sostituire il DOMSource e DOMResult utilizzo con SAX equivalenti.La Stringa XML e util uso di questa classe dovrebbe essere evidente dal contesto.
Altri suggerimenti
Grazie a tutti per le vostre risposte :Ecco il risultato finale
TransformerFactory tFactory = TransformerFactory.newInstance();
InputStream xslt = FeedSecurityException.class.getResourceAsStream("/filter.xslt");
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(new StreamSource(input), new StreamResult(ouput));
E XSLT che chiamare il metodo java per un tipo di nodo e lasciare gli altri incontaminata
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<xsl:template match="CHANGED_NODE">
<xsl:element name="CHANGED_NODE">
<xsl:value-of select="java:com.mypackage.MyClass.tranformContent(.)"/>
</xsl:element>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow