0

Java から xsl 変換にパラメーターを渡すことができることはわかっていますが、変換が完了した後に変数/パラメーターを読み戻すにはどうすればよいですか?

たとえば、次のような xml ドキュメントがあります。

<author>
  <name>Barry Bonds</name>
  <books>
    <book>Hitting Home Runs</book>
    <book>Cheating at Baseball</book>
    <book>Nobody Likes Cooperstown Anyway</book>
  <books>
<author>

1 回の変換で、name 要素を変換して変数として格納し、book 要素を変換して 2 番目の変数として格納できるようにしたいと考えています。次に、変換後に Java コードからこれら 2 つの変数にアクセスしたいと思います。

これは可能ですか?可能であれば、どのように行われますか?

Michael Kay の回答のおかげで、解決策が見つかりました。これに遭遇した他の人のために、これがどのように機能するかを示す単体テストを次に示します。

import net.sf.saxon.*;
import org.junit.Test;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.assertEquals;

public class SimpleTransform {
    @Test
    public void splitOutput() throws TransformerException, UnsupportedEncodingException {
        final Map<String, StreamResult> results = new HashMap<String, StreamResult>();
        results.put("test1", new StreamResult(new ByteArrayOutputStream()));
        results.put("test2", new StreamResult(new ByteArrayOutputStream()));
        results.put("test3", new StreamResult(new ByteArrayOutputStream()));

        TransformerFactoryImpl factory = new TransformerFactoryImpl();
        Source source = new StandardURIResolver(new Configuration()).resolve("transform.xslt", null);
        Controller xsl = (Controller) factory.newTransformer(source);
        xsl.setOutputURIResolver(new OutputURIResolver() {
            @Override
            public Result resolve(String s, String s1) throws TransformerException {
                return results.get(s);
            }

            @Override
            public void close(Result result) throws TransformerException {
            }
        });
        Source xsd = (Source) Transform.loadDocuments("input.xml", false, null, false);
        StreamResult standardResult = new StreamResult(new ByteArrayOutputStream());
        xsl.transform(xsd, standardResult);

        for (Map.Entry<String, StreamResult> stringStreamResultEntry : results.entrySet()) {
            System.out.println(stringStreamResultEntry.getKey() + ": " + ((ByteArrayOutputStream)stringStreamResultEntry.getValue().getOutputStream()).toString("UTF-8"));
        }

        assertEquals("<html>\n   <body>test1</body>\n</html>", ((ByteArrayOutputStream) results.get("test1").getOutputStream()).toString("UTF-8"));
        assertEquals("<html>\n   <body>test2</body>\n</html>", ((ByteArrayOutputStream) results.get("test2").getOutputStream()).toString("UTF-8"));
        assertEquals("<html>\n   <body>test3</body>\n</html>", ((ByteArrayOutputStream) results.get("test3").getOutputStream()).toString("UTF-8"));
    }
}
4

1 に答える 1

2

XSLT 2.0 に切り替え (実際には、あなたのケースでは Saxon を意味します)、 xsl:result-document 命令を使用して各出力を生成します。OutputURIResolver を Saxon に登録することにより、結果ドキュメントを Java アプリケーションに戻すことができます。Saxon は、結果ドキュメントが作成されるたびに通知される単純なクラスです。

于 2012-06-01T18:38:53.877 に答える