2010-08-18 10 views
5

इस सवाल का जवाब एक शीर्ष तकनीक का वर्णन जावा में एक कुशल XSLT पाइपलाइन लागू करने के लिए:कुशल XSLT पाइप लाइन, पैरामीटर वाला, जावा में

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

दुर्भाग्य से, ट्रांसफार्मर की स्थापना के लिए एक API बेनकाब करने के लिए लगता है, जबकि एक्सएसएलटी पैरामीटर, ऐसा कोई प्रभाव नहीं प्रतीत होता है।

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: दुनिया/@ attr खाली है, और foo के पाठ सामग्री: दुनिया कहते हैं, "foo है:"। अपेक्षित व्यवहार यह है कि उन्हें सेट पैरामीटर विधि में पारित पैरामीटर के साथ पॉप्युलेट किया जाना चाहिए था।

क्या इस तकनीक का उपयोग कर एक्सएसएल रूपांतरण पैरामीटर सेट करने का कोई तरीका है। यदि नहीं, तो क्या कोई जावा में कुशलतापूर्वक स्टाइलशीट को बदलने के लिए वैकल्पिक तकनीक की सिफारिश कर सकता है, जैसे एक्सएसएलटी पैरामीटर भी सेट किए जा सकते हैं?

उत्तर

6

समस्या यह है कि प्रत्येक TransformerHandler एक अलग इसके साथ जुड़े ट्रांसफार्मर है। आपके दूसरे टेम्पलेट में कोई समस्या है, लेकिन जैसा कि यह एक उदाहरण है, मुझे लगता है कि कोई फर्क नहीं पड़ता। आप चाहते हैं:

//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

पिछले टिप्पणी से संबंधित बनाने की जरूरत नहीं है। th1.getTransformer() पर ट्रांसफॉर्म() का आविष्कार करने वाला परिणाम th1 पर फिर से इंगित परिणाम के साथ सही नहीं है। इसे दो बार संसाधित किया जाएगा। प्रारंभिक पोस्ट में दिखाए गए नए ट्रांसफॉर्मर() का उपयोग सही तरीका है।

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