0

iso8879 エンティティ文字列が文字の代わりに表示されるように、一部の XML を変換しようとしています。たとえば、文字列1234-5678は になり1234‐5678ます。これは、http://www.w3.org/2003/entities/iso8879doc/overview.htmlにある文字マップとスタイルシートを使用して行いました。

xslt の最初の部分は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="iso8879map.xsl"/>  
    <xsl:output omit-xml-declaration = "yes" use-character-maps="iso8879"/>

Saxon XSLT エンジンを使用して Eclipse でこのスタイルシートを実行すると、正常に動作し、ハイフン文字の代わりにハイフン entitiy 文字列を含む XML ファイルが出力されます。ただし、このプロセスを自動化する必要があるため、JDOM パッケージを使用しています。残念ながら、変身中にキャラクターが入れ替わることはありません。変換を行うコードは次のようになります。

System.setProperty("javax.xml.transform.TransformerFactory",
    "net.sf.saxon.TransformerFactoryImpl");  // use saxon for xslt 2.0 support


SAXBuilder builder = new SAXBuilder();
builder.setExpandEntities(false);       
XSLTransformer transformer = new XSLTransformer(styleSheet);

Document toTransform = builder.build(Fileref); // transform
Document transformed = transformer.transform(toTransform);

次に、次の方法を使用してドキュメントをファイルに書き出します。

public static void writeXMLDoc(File xmlDoc, Document jdomDoc){

    try {
        Format format = Format.getPrettyFormat();
        format.setOmitDeclaration(true);
        format.setEncoding("ISO-8859-1");
        XMLOutputter outputter = new XMLOutputter(format);
        //outputter.output((org.jdom.Document) allChapters, System.out);
        FileWriter writer = new FileWriter(xmlDoc.getAbsolutePath());
        outputter.output((org.jdom.Document) jdomDoc, writer);
        writer.close();
    } 
    catch (java.io.IOException exp) {
        exp.printStackTrace();
    }
}

Eclipse でデバッグを開始しましたが、xslt 変換中にハイフン文字が置き換えられていないようです。私はこれを Saxon xslt エンジンを単独で使用してテストしましたが、動作するため、Java および Jdom から使用することと関係がある可能性があります。誰でも助けることができますか?

どうもありがとう。

ジム

4

1 に答える 1

2

問題は、Saxon が提供する JDOM ラッパー クラスを使用しないことにあることが判明しました。JDOM ドキュメントが変換され、新しい JDOM ドキュメントとして返されることを示す参照用の作業コードを次に示します。

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");  // use saxon for xslt 2.0 support
File styleSheet = new File("filePath");

// Get a TransformerFactory
System.setProperty("javax.xml.transform.TransformerFactory",
                   "com.saxonica.config.ProfessionalTransformerFactory");
TransformerFactory tfactory = TransformerFactory.newInstance();
ProfessionalConfiguration config = (ProfessionalConfiguration)((TransformerFactoryImpl)tfactory).getConfiguration();

// Get a SAXBuilder 
SAXBuilder builder = new SAXBuilder(); 

//Build JDOM Document
Document toTransform = builder.build(inputFileHandle); 

//Give it a Saxon wrapper
DocumentWrapper docw = new DocumentWrapper(toTransform,  inputHandle.getAbsolutePath(), config);

// Compile the stylesheet
Templates templates = tfactory.newTemplates(new StreamSource(styleSheet));
Transformer transformer = templates.newTransformer();

// Now do a transformation
ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);                  
transformer.transform(docw, new StreamResult(outStream));

ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
Document transformed = builder.build(inStream);
于 2011-05-03T10:36:03.233 に答える