<?xml version="1.0"?> <size>5</size>
private void test_xpath_dom() throws Exception { InputSource in = new InputSource(new FileInputStream("xml/data.xml")); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().parse(in); NodeIterator nl = XPathAPI.selectNodeIterator(doc, "/size"); Node n; while ((n = nl.nextNode())!= null) { if (n.getNodeType() == Node.TEXT_NODE) { System.out.println(n.getNodeValue()); } else { System.out.println(n.getTextContent()); } } }
private void test_xpath_dom() throws Exception { System.setProperty(JAVAX_TRANSFORM_FACTORY, XALAN_TRANSFORM_FACTORY); InputSource in = new InputSource(new FileInputStream("xml/data.xml")); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().parse(in); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression xpathExpression = xpath.compile("/size"); System.out.println(xpathExpression.evaluate(doc)); }
private void test_xpath_sax_file() throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(DOMResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler h = stf.newTransformerHandler(); XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setContentHandler(h); reader.setProperty("http://xml.org/sax/properties/lexical-handler", h); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().newDocument(); Result out = new DOMResult(doc); h.setResult(out); reader.parse("xml/data.xml"); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression xpathExpression = xpath.compile("/size"); System.out.println(xpathExpression.evaluate(doc)); } else { throw new Exception("Can''t support SAXSource or DOMResult"); } }
private void generateData(ContentHandler h, String data) throws SAXException { h.startDocument(); h.startElement("", "size", "size", new AttributesImpl()); h.characters(data.toCharArray(), 0, data.length()); h.endElement("", "size", "size"); h.endDocument(); } private void test_xpath_sax_stream(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(DOMResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler h = stf.newTransformerHandler(); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().newDocument(); Result out = new DOMResult(doc); h.setResult(out); generateData(h, size); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression xpathExpression = xpath.compile("/size"); System.out.println(xpathExpression.evaluate(doc)); } else { throw new Exception("Can''t support SAXSource or DOMResult"); } }
private void test_solution(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(); TransformerHandler filter = stf.newTransformerHandler(); TransformerHandler view = stf.newTransformerHandler(); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); generateData(solve, size); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="size"> <result> <xsl:call-template name="queens"> <xsl:with-param name="r"/> <xsl:with-param name="n" select="."/> <xsl:with-param name="s" select="."/> </xsl:call-template> </result> </xsl:template> <xsl:template name="queens"> <xsl:param name="r"/> <xsl:param name="n"/> <xsl:param name="s"/> <xsl:choose> <xsl:when test="$n = 0"> <position> <xsl:copy-of select="$r"/> </position> </xsl:when> <xsl:otherwise> <xsl:call-template name="step"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="n" select="$n"/> <xsl:with-param name="v" select="$s"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="step"> <xsl:param name="r"/> <xsl:param name="n"/> <xsl:param name="v"/> <xsl:param name="s"/> <xsl:if test="$v != 0"> <xsl:variable name="c"> <xsl:call-template name="check"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="v" select="$v"/> </xsl:call-template> </xsl:variable> <xsl:if test="$c != 0"> <xsl:variable name="l"> <xsl:value-of select="concat($v,$r)"/> </xsl:variable> <xsl:call-template name="queens"> <xsl:with-param name="r" select="$l"/> <xsl:with-param name="n" select="$n - 1"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> <xsl:call-template name="step"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="n" select="$n"/> <xsl:with-param name="v" select="$v - 1"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="check"> <xsl:param name="r"/> <xsl:param name="v"/> <xsl:if test="contains($r,$v)">0</xsl:if> </xsl:template> </xsl:stylesheet>
private void test_solution(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(new StreamSource("xsl/solution.xsl")); TransformerHandler filter = stf.newTransformerHandler(); TransformerHandler view = stf.newTransformerHandler(); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); generateData(solve, size); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="solution.xsl"/> <xsl:template name="check"> <xsl:param name="r"/> <xsl:param name="v"/> <xsl:choose> <xsl:when test="contains($r,$v)">0</xsl:when> <xsl:otherwise> <xsl:variable name="y"> <xsl:call-template name="additional_check"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="v" select="$v"/> <xsl:with-param name="d" select="1"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$y"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="additional_check"> <xsl:param name="r"/> <xsl:param name="v"/> <xsl:param name="d"/> <xsl:if test="$d <= string-length($r)"> <xsl:variable name="u" select="substring($r,$d,1)"/> <xsl:variable name="b"> <xsl:call-template name="abs"> <xsl:with-param name="x" select="$v - $u"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$b = $d">0</xsl:when> <xsl:otherwise> <xsl:call-template name="additional_check"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="v" select="$v"/> <xsl:with-param name="d" select="$d + 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="abs"> <xsl:param name="x"/> <xsl:choose> <xsl:when test="$x < 0"> <xsl:value-of select="$x * -1"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$x"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
import java.io.File; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import javax.xml.transform.stream.StreamSource; public class Resolver implements URIResolver { public Source resolve(String href, String base) throws TransformerException { return new StreamSource(new File("xsl/" + href)); } }
private void test_queens(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); + tf.setURIResolver(new Resolver()); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(new StreamSource("xsl/queens.xsl")); TransformerHandler filter = stf.newTransformerHandler(); TransformerHandler view = stf.newTransformerHandler(); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); generateData(solve, size); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="result"> <result> <xsl:value-of select="count(position)"/> </result> </xsl:template> </xsl:stylesheet>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" version="1.0"> <xsl:output method="html"/> <xsl:template match="/result/position"> <a href="{concat(. , '.html')}"> <xsl:value-of select="."/> </a><br/> <redirect:write select="concat('xml/', . , '.html')"> <style> table { display:block; margin:10px; border:0; border-collapse: collapse; } table tr { border:0; } table tr td { border:1px solid #999; width:15px; height:15px; padding: 0; } .active { background: #898989; } </style> <table border="1" style="border-collapse:collapse"> <xsl:call-template name="line"> <xsl:with-param name="r" select="."/> <xsl:with-param name="s" select="string-length(.)"/> </xsl:call-template> </table> </redirect:write> </xsl:template> <xsl:template name="line"> <xsl:param name="r"/> <xsl:param name="s"/> <xsl:if test="string-length($r) != 0"> <xsl:variable name="x" select="substring($r,1,1)"/> <tr> <xsl:call-template name="col"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="$s"/> </xsl:call-template> </tr> <xsl:call-template name="line"> <xsl:with-param name="r" select="substring($r,2)"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="col"> <xsl:param name="x"/> <xsl:param name="i"/> <xsl:if test="$i != 0"> <xsl:choose> <xsl:when test="$x = $i"><td class="active"/></xsl:when> <xsl:otherwise><td/></xsl:otherwise> </xsl:choose> <xsl:call-template name="col"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="$i - 1"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="result"> <result> <xsl:apply-templates/> </result> </xsl:template> <xsl:template match="position"> <position> <xsl:value-of select="."/> </position> <flip> <xsl:call-template name="flip"> <xsl:with-param name="x" select="."/> </xsl:call-template> </flip> <reverse> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="."/> </xsl:call-template> </reverse> <rotate> <xsl:call-template name="rotate"> <xsl:with-param name="x" select="."/> </xsl:call-template> </rotate> </xsl:template> <xsl:template name="flip"> <xsl:param name="x"/> <xsl:call-template name="flip_internal"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="s" select="string-length($x) + 1"/> </xsl:call-template> </xsl:template> <xsl:template name="flip_internal"> <xsl:param name="x"/> <xsl:param name="s"/> <xsl:if test="string-length($x) != 0"> <xsl:value-of select="$s - substring($x,1,1)"/> <xsl:call-template name="flip_internal"> <xsl:with-param name="x" select="substring($x,2)"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> </xsl:template> <!-- XSLT Cookbook By Sal Mangano http://shop.oreilly.com/product/9780596003722.do --> <xsl:template name="reverse"> <xsl:param name="x"/> <xsl:variable name="len" select="string-length($x)"/> <xsl:choose> <xsl:when test="$len < 2"> <xsl:value-of select="$x"/> </xsl:when> <xsl:when test="$len = 2"> <xsl:value-of select="substring($x,2,1)"/> <xsl:value-of select="substring($x,1,1)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="mid" select="floor($len div 2)"/> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="substring($x,$mid+1,$mid+1)"/> </xsl:call-template> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="substring($x,1,$mid)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="rotate"> <xsl:param name="x"/> <xsl:call-template name="rotate_internal"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="1"/> <xsl:with-param name="r"/> </xsl:call-template> </xsl:template> <xsl:template name="rotate_internal"> <xsl:param name="x"/> <xsl:param name="i"/> <xsl:param name="r"/> <xsl:variable name="p"> <xsl:call-template name="index-of"> <xsl:with-param name="input" select="$x"/> <xsl:with-param name="substr" select="$i"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$p = 0"> <xsl:value-of select="$r"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="rotate_internal"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="$i + 1"/> <xsl:with-param name="r" select="concat($p,$r)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- XSLT Cookbook By Sal Mangano http://shop.oreilly.com/product/9780596003722.do --> <xsl:template name="index-of"> <xsl:param name="input"/> <xsl:param name="substr"/> <xsl:choose> <xsl:when test="contains($input,$substr)"> <xsl:value-of select="string-length(substring-before($input,$substr))+1"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="utils.xsl"/> <xsl:template match="result"> <result> <xsl:apply-templates/> </result> </xsl:template> <xsl:template match="position"> <xsl:variable name="l" select="preceding-sibling::position"/> <xsl:variable name="a" select="."/> <xsl:variable name="b"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$a"/> </xsl:call-template> </xsl:variable> <xsl:variable name="c"> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="$b"/> </xsl:call-template> </xsl:variable> <xsl:variable name="d"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$c"/> </xsl:call-template> </xsl:variable> <xsl:variable name="e"> <xsl:call-template name="rotate"> <xsl:with-param name="x" select="$a"/> </xsl:call-template> </xsl:variable> <xsl:variable name="f"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$e"/> </xsl:call-template> </xsl:variable> <xsl:variable name="g"> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="$f"/> </xsl:call-template> </xsl:variable> <xsl:variable name="h"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$g"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$b = $l"></xsl:when> <xsl:when test="$c = $l"></xsl:when> <xsl:when test="$d = $l"></xsl:when> <xsl:when test="$e = $l"></xsl:when> <xsl:when test="$f = $l"></xsl:when> <xsl:when test="$g = $l"></xsl:when> <xsl:when test="$h = $l"></xsl:when> <xsl:otherwise> <position> <xsl:value-of select="$a"/> </position> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
private final static String JAVAX_TRANSFORM_FACTORY = "javax.xml.transform.TransformerFactory"; private final static String SAXON_TRANSFORM_FACTORY = "net.sf.saxon.TransformerFactoryImpl"; private final static String XALAN_TRANSFORM_FACTORY = "org.apache.xalan.processor.TransformerFactoryImpl"; private void test_full(String size) throws Exception { System.setProperty(JAVAX_TRANSFORM_FACTORY, SAXON_TRANSFORM_FACTORY); TransformerFactory tf = TransformerFactory.newInstance(); tf.setURIResolver(new Resolver()); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(new StreamSource("xsl/queens.xsl")); TransformerHandler filter = stf.newTransformerHandler(new StreamSource("xsl/distinct.xsl")); TransformerHandler view = stf.newTransformerHandler(new StreamSource("xsl/count.xsl")); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); Long timestamp = System.currentTimeMillis(); generateData(solve, size); System.out.println("Elapsed Time: " + Long.toString(System.currentTimeMillis() - timestamp)); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
Source: https://habr.com/ru/post/203004/
All Articles