Xpoint
   [напомнить пароль]

javax.xml.transform: динамический XSL темплейт

Метки: [без меток]
[арх]
2006-03-31 11:42:07 [обр] schleicher(0/7)[досье]

Столкнулся с проблемой. Использую для преобразования javax.xml.transform
(так понимаю, это xalan)
Задача: выполнить в java XSLT преобразование. При этом, само преобразование (XSLT документ) должно быть построено динамически в ходе выполнения программы. Во всех примерах по использованию данного пакета Transformer создается с параметром StreamSource (XSL читается из файла). В моем случае, это тоже работало, проблем нет, но при динамическом создании XSL — не получается. В документации сказано, что DOMSource вполне может быть использован при создании Transformer, однако в этом случае после преобразования имеем просто исходный код преобразования (содержимое построенного XSLT).

Что я делаю не так? Как можно решить мою задачу?

Пример моего кода:

public void transform(){
   TransformerFactory tFactory = TransformerFactory.newInstance();
   try {
      DOMSource source = new DOMSource(this.xml);
      DOMSource xsl_ds = new DOMSource(this.xsl);
      Transformer transformer = tFactory.newTransformer(xsl_ds);
      StreamResult result = new StreamResult(System.out);
      transformer.transform(source, result);
   } catch (Exception e) {
      e.printStackTrace();
   }
}

где this.xml и this.xsl - объекты org.w3c.dom с соответствующим содержимым

спустя 5 часов [обр] GRAy(14/259)[досье]
Вот для примера взял предварительно преобразовал файл в DOM и скормил его tFactory.newTransformer - всё получилось. Думаю проблема в самом преобразовании которое вы формируете.
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;

public class XmlTest {
  public static void main(String[] args){
    TransformerFactory tFactory = TransformerFactory.newInstance();
    System.out.println("вошли");
    try {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setNamespaceAware(true);
      Document d = dbf.newDocumentBuilder().parse(new File("xsltest.xsl"));
      StreamSource source = new StreamSource(new File("xmltest.xml"));
      DOMSource xsl_ds = new DOMSource(d.getFirstChild());
      System.out.println(xsl_ds.getNode().getAttributes().getNamedItem("version"));
      Transformer transformer = tFactory.newTransformer(xsl_ds);
      StreamResult result = new StreamResult(System.out);
      transformer.transform(source, result);
    } catch (Exception e) {
       e.printStackTrace();
    }
    //System.exit(0);
  }
}
спустя 2 дня 13 часов [обр] schleicher(0/7)[досье]
Ага, только проблема не в преобразовании, а вот в этом — dbf.setNamespaceAware(true);
Использовал ее - и все получилось.
Powered by POEM™ Engine Copyright © 2002-2005