Question

I ai une série de feuilles de style XSL 2.0 qui se nourrissent dans l'autre, à savoir la sortie de feuille de style A alimente B alimente C.

Quelle est la façon la plus efficace de le faire? La question est reformulée:. Comment peut-on efficacement la route la sortie d'une transformation en une autre

Voici ma première tentative:

@Override
public void transform(Source data, Result out) throws TransformerException{
    for(Transformer autobot : autobots){
        if(autobots.indexOf(autobot) != (autobots.size()-1)){
            log.debug("Transforming prelim stylesheet...");
            data = transform(autobot,data);
        }else{
            log.debug("Transforming final stylesheet...");
            autobot.transform(data, out);
        }
    }
}

private Source transform(Transformer autobot, Source data) throws TransformerException{
    DOMResult result = new DOMResult();
    autobot.transform(data, result);
    Node node = result.getNode();
    return new DOMSource(node);
}

Comme vous pouvez le voir, je suis sur un DOM pour s'asseoir entre les deux transformations, et bien qu'il soit pratique, ses performances non optimales sage.

Yat-il un moyen facile d'acheminer à-dire un itinéraire SAXResult à un SAXSource? Une solution StAX serait une autre option.

Je suis au courant des projets comme XProc , ce qui est très cool si vous n'avez pas pris un coup d'oeil encore, mais je ne voulais pas investir dans un cadre général.

Était-ce utile?

La solution

J'ai trouvé ceci: # 3. Les transformations Chaînage montre deux façons d'utiliser le TransformerFactory aux transformations de la chaîne, ayant les résultats d'une alimentation à transformer la transformation suivante, puis enfin la sortie du système out. Cela évite la nécessité d'une sérialisation intermédiaire à chaîne, fichier, etc. entre les transformations.

  

Lorsque multiple, successive   transformations sont nécessaires à la   même document XML, assurez-vous d'éviter   opérations d'analyse syntaxique inutiles. je   souvent courir dans le code qui   transforme une chaîne à une autre chaîne,   transforme ensuite cette chaîne encore   une autre chaîne. Non seulement est-ce lent,   mais il peut consommer une importante   quantité de mémoire et, en particulier   Si les chaînes intermédiaires ne sont pas   permis soient nettoyés.

     

La plupart des transformations sont basées sur un   série d'événements SAX. Un analyseur SAX   typiquement analyser un InputStream ou   un autre InputSource dans des événements SAX,   qui peut ensuite être amené à un   Transformateur. Plutôt que d'avoir la   Sortie transformateur à un fichier, String,   ou un autre tel résultat, un SAXResult   peut être utilisé à la place. A SAXResult   accepte un ContentHandler, qui peut   passer ces événements SAX directement à   un autre transformateur, etc.

     

Voici une approche, et celle que je   préfèrent généralement car il fournit plus   flexibilité pour les différentes bornes d'entrée et   sources de sortie. Il fait également   assez facile de créer une transformation   chaîne dynamique et avec une variable   nombre de transformations.

SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance();

// These templates objects could be reused and obtained from elsewhere.
Templates templates1 = stf.newTemplates(new StreamSource(
  getClass().getResourceAsStream("MyStylesheet1.xslt")));
Templates templates2 = stf.newTemplates(new StreamSource(
  getClass().getResourceAsStream("MyStylesheet1.xslt")));

TransformerHandler th1 = stf.newTransformerHandler(templates1);
TransformerHandler th2 = stf.newTransformerHandler(templates2);

th1.setResult(new SAXResult(th2));
th2.setResult(new StreamResult(System.out));

Transformer t = stf.newTransformer();
t.transform(new StreamSource(System.in), new SAXResult(th1));

// th1 feeds th2, which in turn feeds System.out.

Autres conseils

Votre meilleur pari est de coller à DOM que vous faites, car un processeur XSLT devrait construire un arbre de toute façon - le streaming est seulement une option pour la catégorie de transformations très limité, et peu si des processeurs peuvent le comprendre automatiquement et passer à une mise en œuvre en streaming uniquement; sinon ils lisent juste l'entrée et à construire l'arbre.

pipeline XSLT efficace, avec params, en Java clarifié sur les paramètres corrects de passage à une telle chaîne de transformation.

Et il a également donné un indice sur la solution légèrement plus courte sans troisième transformateur:

SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance();

Templates templates1 = stf.newTemplates(new StreamSource(
        getClass().getResourceAsStream("MyStylesheet1.xslt")));
Templates templates2 = stf.newTemplates(new StreamSource(
        getClass().getResourceAsStream("MyStylesheet2.xslt")));

TransformerHandler th1 = stf.newTransformerHandler(templates1);
TransformerHandler th2 = stf.newTransformerHandler(templates2);

th2.setResult(new StreamResult(System.out));

// Note that indent, etc should be applied to the last transformer in chain:
th2.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes");

th1.getTransformer().transform(new StreamSource(System.in), new SAXResult(th2));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top