0

複数の入力ファイル(XML / HTML / XHTML)と対応するXSLTを使用して、対応する入力ファイルの出力ファイルを生成したいと思います。入力XMLファイルと入力XSLTファイルが1つしかない場合は、次のプログラムから正常に変換できます。たとえば、giveプログラムでは、入力(X)HTMLファイルはtemp.htmlであり、入力XSLTはtemp.xslであり、出力をtemp_copy.htmlとして生成します。2つ以上の入力ファイルtemp1.htmlとtemp2.​​html、および対応するXSLT temp1.xslとtemp2.​​xslがある場合、対応するtemp1_copy.htmlとtemp2_copy.htmlを使用して出力temp1_copy.htmlとtemp2_copy.htmlを生成するにはどうすればよいですか。入力ファイル?ありがとう!

私の現在のJavaコード:

 public class SimpleXSLT {
    public static void main(String[] args) {

        String inXML = "C:/tmp/temp.html";
        String inXSL = "C:/tmp/temp.xsl";
        String outTXT = "C:/tmp/temp_copy.html";
        SimpleXSLT st = new SimpleXSLT();
        try {
            st.transform(inXML,inXSL,outTXT);
            } catch(TransformerConfigurationException e) {
            System.err.println("Invalid factory configuration");
            System.err.println(e);
            } catch(TransformerException e) {
            System.err.println("Error during transformation");
            System.err.println(e);
        }
    }
    public void transform(String inXML,String inXSL,String outTXT)
    throws TransformerConfigurationException,
    TransformerException {
        TransformerFactory factory = TransformerFactory.newInstance();
        StreamSource xslStream = new StreamSource(inXSL);
        Transformer transformer = factory.newTransformer(xslStream);
        transformer.setErrorListener(new MyErrorListener());
        StreamSource in = new StreamSource(inXML);
        StreamResult out = new StreamResult(outTXT);
        transformer.transform(in,out);
        System.out.println("The generated XML file is:" + outTXT);
    }
}
class MyErrorListener implements ErrorListener {
    public void warning(TransformerException e)
    throws TransformerException {
        show("Warning",e);
        throw(e);
    }
    public void error(TransformerException e)
    throws TransformerException {
        show("Error",e);
        throw(e);
    }
    public void fatalError(TransformerException e)
    throws TransformerException {
        show("Fatal Error",e);
        throw(e);
    }
    private void show(String type,TransformerException e) {
        System.out.println(type + ": " + e.getMessage());
        if(e.getLocationAsString() != null)
        System.out.println(e.getLocationAsString());
    }
}
4

1 に答える 1

2

TrAX とも呼ばれる JAXP 変換 API を使用しているので、そのまま使用します。XSLT 2.0 と Saxon に移行した場合は、Saxon の s9api API を使用したほうがよいでしょうが、高度な 2.0 機能を必要としない限り、Saxon は TrAX もサポートします。

TrAX では、「コンパイルされた」スタイルシートを表すオブジェクトは Templates オブジェクトです。したがって、TransformerFactory.newTemplates() を使用してスタイルシートをコンパイルすると、この Templates オブジェクトを繰り返し使用して複数のソース ドキュメントを変換できます。Templates.newTransformer() は、変換の実行に使用できるトランスフォーマーを提供します。実際、Transformer を繰り返し (直列ではなく並列で) 使用して複数の変換を実行できますが、毎回新しい Transformer を使用することをお勧めします。テンプレートを再利用すると、パフォーマンスが向上します。Templates オブジェクトもスレッドセーフです。

1.0 対 2.0 に関しては。多くの単純な変換には 1.0 で十分ですが、2.0 でははるかに簡単に達成できるグループ化や文字列操作などをすぐに行うことができます。広く使用されているオープンソースの XSLT 2.0 プロセッサが Java プラットフォーム (Saxon) で利用でき、互換性のある API を備えているため、最近では XSLT 1.0 を使用する理由はほとんどありません。

多くの人は、スタイルシートの version 属性が XSLT 1.0 または 2.0 プロセッサを選択するために何らかの形で使用されていると誤解しています。通常はそうではありません (XML Spy などの一部の IDE を除いて)。むしろ、作成者が作成した XSLT 仕様のバージョンをプロセッサに通知するために存在します。version="1.0" と指定して 2.0 プロセッサを選択すると、XSLT 1.0 との最大限の互換性を維持しようとする一種の "quirks" モードで実行されます。整数。逆に、version="2.0" と指定して 1.0 プロセッサを選択すると、プロセッサは、理解できない言語構造に遭遇したときに、これらをコンパイル時のエラーとして拒否するのではなく、フォールバック アクションを実行しようとします。

于 2012-08-01T08:48:02.510 に答える