2010-08-18 3 views
5

Верхний ответ на этот вопрос описан способ для реализации эффективного трубопровода XSLT в Java:Эффективное XSLT трубопровода, с Params, в Java

Efficient XSLT pipeline in Java (or redirecting Results to Sources)

К сожалению, в то время как трансформатор, кажется, разоблачить API для установки XSLT, это, похоже, не имеет никакого эффекта. Например, у меня есть следующий код:

Transformer.java

import javax.xml.transform.sax.SAXTransformerFactory; 
import javax.xml.transform.Templates; 
import javax.xml.transform.sax.TransformerHandler; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.transform.sax.SAXResult; 
import javax.xml.transform.Transformer; 
import java.io.File; 
public class MyTransformer { 
    public static void main(String[] args) throws javax.xml.transform.TransformerConfigurationException, javax.xml.transform.TransformerException{ 
     SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); 

     // These templates objects could be reused and obtained from elsewhere. 
     Templates templates1 = stf.newTemplates(new StreamSource(new File("MyStylesheet1.xslt"))); 
     Templates templates2 = stf.newTemplates(new StreamSource(new File("MyStylesheet2.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(); 

      //SETTING PARAMETERS HERE 
     t.setParameter("foo","this is from param 1"); 
     t.setParameter("bar","this is from param 2"); 

     t.transform(new StreamSource(new File("in.xml")), new SAXResult(th1)); 

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

MyStylesheet1.xslt

<?xml version="1.0"?> 
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:foo="urn:foo" version="1.0"> 
    <output method="xml"/> 

    <param name="foo"/> 

    <template match="@*|node()"> 
     <copy> 
      <apply-templates select="@*|node()"/> 
     </copy> 
    </template> 

    <template match="foo:my/foo:hello"> 
     <copy> 
      <foo:world> 
       foo is : <value-of select="$foo"/> 
      </foo:world> 
     </copy> 

    </template> 
</stylesheet> 

MyStylesheet2.xslt

<?xml version="1.0"?> 
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:foo="urn:foo" version="1.0"> 
    <output method="xml"/> 

    <param name="bar"/> 

    <template match="@*|node()"> 
     <copy> 
      <apply-templates select="@*|node()"/> 
     </copy> 
    </template> 

    <template match="foo:my/foo:hello/foo:world"> 
     <copy> 
      <apply-templates select="@*|node()"/> 

      <attribute name="attr"> 
       <value-of select="$bar"/> 
      </attribute> 
     </copy> 

    </template> 
</stylesheet> 

in.xml

<my xmlns="urn:foo"> 
    <hello/> 
</my> 

Который дает мне следующий вывод:

<?xml version="1.0" encoding="UTF-8"?><my xmlns="urn:foo"> 
     <hello><foo:world xmlns:foo="urn:foo">foo is : </foo:world></hello> 
</my> 

Как вы можете видеть Foo: мир/@ атр пуст, и текстовое содержимое обув: мир говорит: «Foo является:». Ожидаемое поведение заключается в том, что они должны были заполняться параметрами, передаваемыми в метод setParameter.

Есть ли способ установить параметры преобразования XSL, используя эту технику. Если нет, может ли кто-нибудь рекомендовать альтернативный метод для эффективного преобразования таблиц стилей в Java, так что параметры XSLT также могут быть установлены?

ответ

6

Проблема в том, что каждый TransformerHandler имеет отдельный трансформатор, связанный с ним. Проблема с вашим 2-м шаблоном, но поскольку это пример, я думаю, это не имеет значения. Вы хотите:

//SETTING PARAMETERS HERE 
th1.getTransformer().setParameter("foo","this is from param 1"); 
th2.getTransformer().setParameter("bar","this is from param 2"); 

Обратите внимание, что вы также не нужны, чтобы создать 3-й трансформатор вы можете просто начать цепное преобразование th1.getTransformer()

0

, связанный с последней нотой. invoke transform() на th1.getTransformer() с результатом, указывающим снова на th1, неверен. Он будет обработан дважды. с использованием нового Transformer(), как показано в исходном сообщении, является правильным способом.

t.transform(new StreamSource(new File("in.xml")), new SAXResult(th1)); 

 Смежные вопросы

  • Нет связанных вопросов^_^