Skip to content

Commit f8edaa3

Browse files
2_10_Xslt
1 parent ae3f45e commit f8edaa3

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package ru.javaops.masterjava.xml.util;
2+
3+
import javax.xml.transform.*;
4+
import javax.xml.transform.stream.StreamResult;
5+
import javax.xml.transform.stream.StreamSource;
6+
import java.io.*;
7+
import java.nio.charset.StandardCharsets;
8+
9+
public class XsltProcessor {
10+
private static TransformerFactory FACTORY = TransformerFactory.newInstance();
11+
private final Transformer xformer;
12+
13+
public XsltProcessor(InputStream xslInputStream) {
14+
this(new BufferedReader(new InputStreamReader(xslInputStream, StandardCharsets.UTF_8)));
15+
}
16+
17+
public XsltProcessor(Reader xslReader) {
18+
try {
19+
Templates template = FACTORY.newTemplates(new StreamSource(xslReader));
20+
xformer = template.newTransformer();
21+
} catch (TransformerConfigurationException e) {
22+
throw new IllegalStateException("XSLT transformer creation failed: " + e.toString(), e);
23+
}
24+
}
25+
26+
public String transform(InputStream xmlInputStream) throws TransformerException {
27+
StringWriter out = new StringWriter();
28+
transform(xmlInputStream, out);
29+
return out.getBuffer().toString();
30+
}
31+
32+
public void transform(InputStream xmlInputStream, Writer result) throws TransformerException {
33+
transform(new BufferedReader(new InputStreamReader(xmlInputStream, StandardCharsets.UTF_8)), result);
34+
}
35+
36+
public void transform(Reader sourceReader, Writer result) throws TransformerException {
37+
xformer.transform(new StreamSource(sourceReader), new StreamResult(result));
38+
}
39+
40+
public static String getXsltHeader(String xslt) {
41+
return "<?xml-stylesheet type=\"text/xsl\" href=\"" + xslt + "\"?>\n";
42+
}
43+
}

src/main/resources/cities.xsl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
2+
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
3+
<xsl:strip-space elements="*"/>
4+
<xsl:template match="/*[name()='Payload']/*[name()='Cities']/*[name()='City']">
5+
<xsl:copy-of select="."/>
6+
<xsl:text>&#xa;</xsl:text><!-- put in the newline -->
7+
</xsl:template>
8+
<xsl:template match="text()"/>
9+
</xsl:stylesheet>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ru.javaops.masterjava.xml.util;
2+
3+
import com.google.common.io.Resources;
4+
import org.junit.Test;
5+
6+
import java.io.InputStream;
7+
8+
public class XsltProcessorTest {
9+
@Test
10+
public void transform() throws Exception {
11+
try (InputStream xslInputStream = Resources.getResource("cities.xsl").openStream();
12+
InputStream xmlInputStream = Resources.getResource("payload.xml").openStream()) {
13+
14+
XsltProcessor processor = new XsltProcessor(xslInputStream);
15+
System.out.println(processor.transform(xmlInputStream));
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)