代码之家  ›  专栏  ›  技术社区  ›  Bill K

带有Xalan-J的xsl-cdata部分元素输出属性

  •  1
  • Bill K  · 技术社区  · 17 年前

    test.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <parentelem>
        <childelem>Test text</childelem>
    </parentelem>
    

    test.xsl

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" cdata-section-elements="newchildelem" />
    <xsl:template match="/">
    <parentelem>
        <newchildelem><xsl:value-of select="/parentelem/childelem" /></newchildelem>
    </parentelem>
    </xsl:template>
    </xsl:stylesheet>
    

    Transform.java

    import java.io.FileReader;
    import java.io.StringWriter;
    
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLOutputFactory;
    import javax.xml.stream.XMLStreamReader;
    import javax.xml.stream.XMLStreamWriter;
    import javax.xml.transform.Result;
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stax.StAXResult;
    import javax.xml.transform.stax.StAXSource;
    
    public class Transform {
    
        public static void main (String[] args){
        try {
            XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(
                new FileReader("test.xml"));
    
            XMLStreamReader xslReader = XMLInputFactory.newInstance().createXMLStreamReader(
                    new FileReader("test.xsl"));
    
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Source xslSource = new StAXSource(xslReader);
            Source xmlSource = new StAXSource(xmlReader);
            Transformer transf = transformerFactory.newTransformer(xslSource);
    
            StringWriter xmlString = new StringWriter();
            XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(
                    xmlString);
    
            Result transformedXml = new StAXResult(xmlWriter);
            transf.transform(xmlSource, transformedXml);
    
            xmlWriter.flush();
            System.out.println(xmlString.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    }
    

    <?xml version="1.0" encoding="UTF-8"?><parentelem><newchildelem>Test text</newchildelem></parentelem>
    
    3 回复  |  直到 17 年前
        1
  •  1
  •   Mark Schultheiss    17 年前

    <newchildelem><xsl:value-of select="/parentelem/childelem" /></newchildelem>
    

    随着

    <newchildelem><xsl:text>&lt;![CDATA[
    </xsl:text><xsl:value-of select="/parentelem/childelem" /><xsl:text>]]&gt</xsl:text></newchildelem>
    

    <newchildelem><![CDATA[Test text]]></newchildelem>
    

        2
  •  1
  •   skaffman    17 年前

    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    import javax.xml.transform.stream.StreamSource;
    
    import org.apache.xalan.Version;
    
    public class Transform {
    
        public static void main(String[] args) throws Exception {
            System.out.println(Version.getVersion());
            Source xslSource = new StreamSource(Transform.class.getResourceAsStream("test.xsl"));
            Source xmlSource = new StreamSource(Transform.class.getResourceAsStream("test.xml"));
    
            Transformer transf = TransformerFactory.newInstance().newTransformer(xslSource);
    
            StreamResult transformedXml = new StreamResult(System.out);
            transf.transform(xmlSource, transformedXml);
        }
    }
    

    Xalan Java 2.4.1
    <?xml version="1.0" encoding="UTF-8"?>
    <parentelem><newchildelem><![CDATA[Test text]]></newchildelem></parentelem>
    

    此处使用2.7.1。

        3
  •  0
  •   Community Mohan Dere    9 年前

    1) 我想事实证明我没有使用Xalan 2.7.1。代码在 skaffman's

    2) 我从使用StAXSource和StAXResult切换到使用StreamSource和StreamResult,它工作得很好(如 斯卡夫曼的 答案)。具体来说,从StAXResult到StreamResult的更改是有效的。将StAXSource与StreamResult一起使用也是可行的。