{"id":203004,"date":"2013-11-21T13:35:03","date_gmt":"2013-11-21T09:35:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=203004"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=203004","title":{"rendered":"<span class=\"post_title\">Xalan, Saxon \u0438 8 \u0444\u0435\u0440\u0437\u0435\u0439<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" align=\"left\" src=\"http:\/\/habr.habrastorage.org\/post_images\/bc5\/fea\/674\/bc5fea6746e919f2eda0823e322fcd7d.png\"\/><br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/XSLT\">XSLT<\/a>. \u042d\u0442\u043e\u0442, \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439, \u044f\u0437\u044b\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c XML-\u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u043a\u043e\u043b\u044c \u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0434\u0432\u0443\u0445 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 (\u0432 \u0441\u0440\u0435\u0434\u0435 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 Java-\u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%B2%D0%BE%D1%81%D1%8C%D0%BC%D0%B8_%D1%84%D0%B5%D1%80%D0%B7%D1%8F%D1%85\">\u0437\u0430\u0434\u0430\u0447\u0443<\/a> \u043e \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 8-\u043c\u0438 \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0435. <\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c XSLT \u0432\u0440\u044f\u0434 \u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u043e\u043f\u0438\u043a \u043f\u043e\u043c\u0435\u0449\u0435\u043d \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b. \u0412 \u0442\u043e-\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0447\u0435\u0431\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4><a href=\"http:\/\/xml.apache.org\/xalan-j\/\">Xalan<\/a> vs <a href=\"http:\/\/saxon.sourceforge.net\/\">Saxon<\/a><\/h4>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 XSLT, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Java, \u0432\u044b\u0431\u043e\u0440 (\u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434) \u0441\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a \u0434\u0432\u0443\u043c \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u043c \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/MSXML\">Microsoft<\/a>, \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043d\u0435\u0439\u0442\u0438\u0432\u043d\u043e\u0439 dll, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442 <a href=\"http:\/\/docs.oracle.com\/cd\/B19306_01\/server.102\/b14200\/functions229.htm\">Oracle<\/a> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b (\u043c\u0435\u043d\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0438\u0437 Java-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 XSLT, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0425\u0430\u0431\u0440\u0430).<\/p>\n<p>  Saxon, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u043c, \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c, XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. <a href=\"http:\/\/www.saxonica.com\/feature-matrix.html\">\u041c\u0430\u0442\u0440\u0438\u0446\u0430<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442. \u0425\u043e\u0442\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u043c\u0438, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c <a href=\"http:\/\/en.wikipedia.org\/wiki\/Mozilla_Public_License\">Mozilla Public License version 1.0<\/a> <a href=\"http:\/\/saxon.sourceforge.net\/#F9.4HE\">Saxon HE<\/a> \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 XPath \u0438 XSLT \u043a\u0430\u043a \u0432\u0435\u0440\u0441\u0438\u0438 1.0, \u0442\u0430\u043a \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 2.0. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 XSLT 2.0 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0435\u0433\u043b\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430 <a href=\"http:\/\/shop.oreilly.com\/product\/9780596003722.do\">XSLT Cookbook<\/a> \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e\u043c Sal Mangano.<\/p>\n<p>  \u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e\u043c Xalan, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 Saxon, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0439 <a href=\"http:\/\/xml.apache.org\/xalan-j\/#license1.1\">Apache License Version 1.1<\/a>. \u042d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 XSLT \u0432\u0435\u0440\u0441\u0438\u0438 1.0. \u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u0437\u044b\u0440\u0435\u043c, \u043a\u0430\u043a Xalan \u0442\u0430\u043a \u0438 Saxon, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u043c\u0438 \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 <a href=\"http:\/\/xml.apache.org\/xalan-j\/trax.html\">TrAX<\/a>. \u041e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d\u043e \u043d\u0443\u0436\u043d\u043e, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.<\/p>\n<h4>\u0418\u043c\u0435\u043d\u0435\u043c TrAX-\u0430 \u0438 JAXP-\u0430 \u0435\u0433\u043e<\/h4>\n<p>  TrAX \u2014 \u044d\u0442\u043e API \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f XML-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0440\u044f\u0434\u043e\u043c \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439 \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438. \u0412 \u0447\u0430\u0441\u0442\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0435\u0439\u0441\u044f \u043a Java API \u043e\u043d \u0431\u044b\u043b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d Sun \u043a\u0430\u043a <a href=\"http:\/\/ru.wikipedia.org\/wiki\/JAXP\">JAXP<\/a> 6 \u0444\u0435\u0432\u0440\u0430\u043b\u044f 2001 \u0433\u043e\u0434\u0430. \u0414\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f JAXP \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/www.ibm.com\/developerworks\/ru\/library\/x-jaxp\/\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435<\/a> <a href=\"http:\/\/www.ibm.com\/developerworks\/ru\/library\/x-jaxp2\/\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>  \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, JAXP \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 XML-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 Java, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u0430\u043a <a href=\"http:\/\/ru.wikipedia.org\/wiki\/Document_Object_Model\">DOM<\/a>, \u0442\u0430\u043a \u0438 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/SAX\">SAX<\/a> (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f XSLT-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f), \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u043a\u043e\u0434 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e jar-\u0430 \u0432 classpath \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 System Property (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0432 classpath \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c).<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c XML-\u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 XPath.<\/p>\n<p>  XML-\u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt; &lt;size&gt;5&lt;\/size&gt; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e (\u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0438).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f DOM<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate void test_xpath_dom() throws Exception { \t\tInputSource in = new InputSource(new FileInputStream(&quot;xml\/data.xml&quot;)); \t\tDocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); \t\tDocument doc = df.newDocumentBuilder().parse(in); \t\t \t\tNodeIterator nl = XPathAPI.selectNodeIterator(doc, &quot;\/size&quot;); \t\tNode n; \t    while ((n = nl.nextNode())!= null) { \t    \tif (n.getNodeType() == Node.TEXT_NODE) { \t    \t\tSystem.out.println(n.getNodeValue()); \t    \t} else { \t    \t\tSystem.out.println(n.getTextContent()); \t    \t} \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 XPath-\u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043d\u0430\u0431\u043e\u0440\u0443 \u0443\u0437\u043b\u043e\u0432 (\u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430) \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b) \u0438\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442). \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0432\u0441\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0434\u043e\u0441\u0442\u0430\u0435\u043c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f DOM<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate void test_xpath_dom() throws Exception { \t\tSystem.setProperty(JAVAX_TRANSFORM_FACTORY, XALAN_TRANSFORM_FACTORY); \t\tInputSource in = new InputSource(new FileInputStream(&quot;xml\/data.xml&quot;)); \t\tDocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); \t\tDocument doc = df.newDocumentBuilder().parse(in); \t\t \t\tXPathFactory xpathFactory = XPathFactory.newInstance(); \t\tXPath xpath = xpathFactory.newXPath(); \t\tXPathExpression xpathExpression = xpath.compile(&quot;\/size&quot;); \t\tSystem.out.println(xpathExpression.evaluate(doc)); \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0418\u043d\u043e\u0433\u0434\u0430 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 XML-\u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f DOM \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c). \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 XML \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 SAX. JAXP \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 SAX \u0432 DOM) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e (\u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0442\u0438\u043b\u0435\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0431\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0443\u0434\u043e\u0431\u043d\u043e):<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c SAX-\u043f\u0430\u0440\u0441\u0435\u0440<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate void test_xpath_sax_file() throws Exception { \t\tTransformerFactory tf = TransformerFactory.newInstance(); \t    if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(DOMResult.FEATURE)) { \t        SAXTransformerFactory stf = (SAXTransformerFactory)tf;\t   \t        TransformerHandler h = stf.newTransformerHandler(); \t    \tXMLReader reader = XMLReaderFactory.createXMLReader(); \t        reader.setContentHandler(h); \t        reader.setProperty(&quot;http:\/\/xml.org\/sax\/properties\/lexical-handler&quot;, h);  \t\t\tDocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); \t\t\tDocument doc = df.newDocumentBuilder().newDocument(); \t\t\tResult out = new DOMResult(doc); \t\t\th.setResult(out); \t\t\treader.parse(&quot;xml\/data.xml&quot;); \t         \t        XPathFactory xpathFactory = XPathFactory.newInstance(); \t        XPath xpath = xpathFactory.newXPath(); \t        XPathExpression xpathExpression = xpath.compile(&quot;\/size&quot;); \t        System.out.println(xpathExpression.evaluate(doc)); \t    } else { \t    \tthrow new Exception(&quot;Can''t support SAXSource or DOMResult&quot;); \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 XML-\u0444\u0430\u0439\u043b\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c DOM. \u041a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0430\u0439\u043b\u044b? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c SAX-\u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e XML-\u0444\u0430\u0439\u043b\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0441\u044f \u043d\u0435 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c SAX-\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 SAX-\u043f\u043e\u0442\u043e\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate void generateData(ContentHandler h, String data) throws SAXException { \t\th.startDocument(); \t\th.startElement(&quot;&quot;, &quot;size&quot;, &quot;size&quot;, new AttributesImpl()); \t\th.characters(data.toCharArray(), 0, data.length()); \t\th.endElement(&quot;&quot;, &quot;size&quot;, &quot;size&quot;); \t\th.endDocument(); \t} \t  \tprivate void test_xpath_sax_stream(String size) throws Exception { \t\tTransformerFactory tf = TransformerFactory.newInstance(); \t    if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(DOMResult.FEATURE)) { \t        SAXTransformerFactory stf = (SAXTransformerFactory)tf;\t   \t        TransformerHandler h = stf.newTransformerHandler();  \t\t\tDocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); \t\t\tDocument doc = df.newDocumentBuilder().newDocument(); \t\t\tResult out = new DOMResult(doc); \t\t\th.setResult(out); \t\t\tgenerateData(h, size); \t         \t        XPathFactory xpathFactory = XPathFactory.newInstance(); \t        XPath xpath = xpathFactory.newXPath(); \t        XPathExpression xpathExpression = xpath.compile(&quot;\/size&quot;); \t        System.out.println(xpathExpression.evaluate(doc)); \t    } else { \t    \tthrow new Exception(&quot;Can''t support SAXSource or DOMResult&quot;); \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u0425\u043e\u0447\u0443 \u043b\u0438\u0448\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0447\u044c \u043e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 uri \u0432\u044b\u0437\u043e\u0432\u043e\u0432 startElement \u0438 endElement null-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0414\u043b\u044f Xalan \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043d\u043e Saxon \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 NullPointerException.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u044b, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate void test_solution(String size) throws Exception { \t\tTransformerFactory tf = TransformerFactory.newInstance(); \t    if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { \t        SAXTransformerFactory stf = (SAXTransformerFactory)tf;\t   \t        TransformerHandler solve  = stf.newTransformerHandler(); \t        TransformerHandler filter = stf.newTransformerHandler(); \t        TransformerHandler view   = stf.newTransformerHandler(); \t        Result result = new StreamResult(new File(&quot;xml\/result.xml&quot;)); \t         \t        solve.setResult(new SAXResult(filter)); \t        filter.setResult(new SAXResult(view)); \t        view.setResult(result); \t\t\tgenerateData(solve, size); \t    } else { \t    \tthrow new Exception(&quot;Can''t support SAXSource or SAXResult&quot;); \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043a\u0430, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0437\u0434\u0435\u0441\u044c \u0442\u0440\u0438 \u043f\u0443\u0441\u0442\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0445 XSLT-\u043a\u043e\u0434\u043e\u043c.<\/p>\n<h4>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0441\u043d\u0430\u0440\u044f\u0434\u0443<\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0435 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0431\u0438\u043b\u0438 \u0434\u0440\u0443\u0433-\u0434\u0440\u0443\u0433\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0439. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0437\u0430\u0434\u0430\u0447\u0438, \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u0446\u0438\u0444\u0440 \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439. <\/p>\n<p>  \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0446\u0438\u0444\u0440\u044b \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u0430 \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u043d\u043e\u043c\u0435\u0440 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0444\u0438\u0433\u0443\u0440\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043e\u0442 1&#215;1 \u0434\u043e 9&#215;9 \u043a\u043b\u0435\u0442\u043e\u043a. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 8-\u043c\u0438 (5&#215;5 \u043a\u043b\u0435\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437). \u041a\u043e\u0434 \u043d\u0430 XSLT (\u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u0438\u0437\u043b\u0438\u0448\u043d\u044e\u044e \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e\u0441\u0442\u044c) \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">solution.xsl<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt;   &lt;xsl:stylesheet    xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;    version=&quot;1.0&quot;&gt;    &lt;xsl:template match=&quot;size&quot;&gt;     &lt;result&gt;       &lt;xsl:call-template name=&quot;queens&quot;&gt;         &lt;xsl:with-param name=&quot;r&quot;\/&gt;         &lt;xsl:with-param name=&quot;n&quot; select=&quot;.&quot;\/&gt;         &lt;xsl:with-param name=&quot;s&quot; select=&quot;.&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/result&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;queens&quot;&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:param name=&quot;n&quot;\/&gt;     &lt;xsl:param name=&quot;s&quot;\/&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;$n = 0&quot;&gt;         &lt;position&gt;           &lt;xsl:copy-of select=&quot;$r&quot;\/&gt;         &lt;\/position&gt;       &lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;         &lt;xsl:call-template name=&quot;step&quot;&gt;           &lt;xsl:with-param name=&quot;r&quot; select=&quot;$r&quot;\/&gt;           &lt;xsl:with-param name=&quot;n&quot; select=&quot;$n&quot;\/&gt;           &lt;xsl:with-param name=&quot;v&quot; select=&quot;$s&quot;\/&gt;           &lt;xsl:with-param name=&quot;s&quot; select=&quot;$s&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;step&quot;&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:param name=&quot;n&quot;\/&gt;     &lt;xsl:param name=&quot;v&quot;\/&gt;     &lt;xsl:param name=&quot;s&quot;\/&gt;     &lt;xsl:if test=&quot;$v != 0&quot;&gt;       &lt;xsl:variable name=&quot;c&quot;&gt;         &lt;xsl:call-template name=&quot;check&quot;&gt;           &lt;xsl:with-param name=&quot;r&quot; select=&quot;$r&quot;\/&gt;           &lt;xsl:with-param name=&quot;v&quot; select=&quot;$v&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/xsl:variable&gt;       &lt;xsl:if test=&quot;$c != 0&quot;&gt;         &lt;xsl:variable name=&quot;l&quot;&gt;           &lt;xsl:value-of select=&quot;concat($v,$r)&quot;\/&gt;          &lt;\/xsl:variable&gt;         &lt;xsl:call-template name=&quot;queens&quot;&gt;           &lt;xsl:with-param name=&quot;r&quot; select=&quot;$l&quot;\/&gt;           &lt;xsl:with-param name=&quot;n&quot; select=&quot;$n - 1&quot;\/&gt;           &lt;xsl:with-param name=&quot;s&quot; select=&quot;$s&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/xsl:if&gt;       &lt;xsl:call-template name=&quot;step&quot;&gt;         &lt;xsl:with-param name=&quot;r&quot; select=&quot;$r&quot;\/&gt;         &lt;xsl:with-param name=&quot;n&quot; select=&quot;$n&quot;\/&gt;         &lt;xsl:with-param name=&quot;v&quot; select=&quot;$v - 1&quot;\/&gt;         &lt;xsl:with-param name=&quot;s&quot; select=&quot;$s&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:if&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;check&quot;&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:param name=&quot;v&quot;\/&gt;     &lt;xsl:if test=&quot;contains($r,$v)&quot;&gt;0&lt;\/xsl:if&gt;   &lt;\/xsl:template&gt;  &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0439 \u0431\u043e\u0439 \u0444\u0438\u0433\u0443\u0440, \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0431\u043e\u044f \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">8 \u043b\u0430\u0434\u0435\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate void test_solution(String size) throws Exception { \t\tTransformerFactory tf = TransformerFactory.newInstance(); \t    if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { \t        SAXTransformerFactory stf = (SAXTransformerFactory)tf;\t   \t        TransformerHandler solve  = stf.newTransformerHandler(new StreamSource(&quot;xsl\/solution.xsl&quot;)); \t        TransformerHandler filter = stf.newTransformerHandler(); \t        TransformerHandler view   = stf.newTransformerHandler(); \t        Result result = new StreamResult(new File(&quot;xml\/result.html&quot;)); \t         \t        solve.setResult(new SAXResult(filter)); \t        filter.setResult(new SAXResult(view)); \t        view.setResult(result); \t\t\tgenerateData(solve, size); \t    } else { \t    \tthrow new Exception(&quot;Can''t support SAXSource or SAXResult&quot;); \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u2026 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u00ab8 \u043b\u0430\u0434\u0435\u0439\u00bb.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043e\u0431\u0432\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0434\u043c\u0435\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u044f \u0444\u0438\u0433\u0443\u0440. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, XSLT \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0430. \u0415\u0439 \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">queens.xsl<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt;   &lt;xsl:stylesheet    xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;    version=&quot;1.0&quot;&gt;    &lt;xsl:import href=&quot;solution.xsl&quot;\/&gt;    &lt;xsl:template name=&quot;check&quot;&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:param name=&quot;v&quot;\/&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;contains($r,$v)&quot;&gt;0&lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;         &lt;xsl:variable name=&quot;y&quot;&gt;           &lt;xsl:call-template name=&quot;additional_check&quot;&gt;             &lt;xsl:with-param name=&quot;r&quot; select=&quot;$r&quot;\/&gt;             &lt;xsl:with-param name=&quot;v&quot; select=&quot;$v&quot;\/&gt;             &lt;xsl:with-param name=&quot;d&quot; select=&quot;1&quot;\/&gt;           &lt;\/xsl:call-template&gt;         &lt;\/xsl:variable&gt;         &lt;xsl:value-of select=&quot;$y&quot;\/&gt;        &lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;additional_check&quot;&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:param name=&quot;v&quot;\/&gt;     &lt;xsl:param name=&quot;d&quot;\/&gt;     &lt;xsl:if test=&quot;$d &amp;lt;= string-length($r)&quot;&gt;       &lt;xsl:variable name=&quot;u&quot; select=&quot;substring($r,$d,1)&quot;\/&gt;       &lt;xsl:variable name=&quot;b&quot;&gt;         &lt;xsl:call-template name=&quot;abs&quot;&gt;           &lt;xsl:with-param name=&quot;x&quot; select=&quot;$v - $u&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/xsl:variable&gt;       &lt;xsl:choose&gt;         &lt;xsl:when test=&quot;$b = $d&quot;&gt;0&lt;\/xsl:when&gt;         &lt;xsl:otherwise&gt;           &lt;xsl:call-template name=&quot;additional_check&quot;&gt;             &lt;xsl:with-param name=&quot;r&quot; select=&quot;$r&quot;\/&gt;             &lt;xsl:with-param name=&quot;v&quot; select=&quot;$v&quot;\/&gt;             &lt;xsl:with-param name=&quot;d&quot; select=&quot;$d + 1&quot;\/&gt;           &lt;\/xsl:call-template&gt;         &lt;\/xsl:otherwise&gt;       &lt;\/xsl:choose&gt;     &lt;\/xsl:if&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;abs&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;$x &amp;lt; 0&quot;&gt;         &lt;xsl:value-of select=&quot;$x * -1&quot;\/&gt;       &lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;         &lt;xsl:value-of select=&quot;$x&quot;\/&gt;       &lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;  &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e import, \u0430 \u043d\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e include, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c (\u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435).<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0438\u043c\u043f\u043e\u0440\u0442 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 Java-\u043a\u043e\u0434. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c URIResolver, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 URI \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 XSLT:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Resolver.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">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 {  \tpublic Source resolve(String href, String base) throws TransformerException { \t\treturn new StreamSource(new File(&quot;xsl\/&quot; + href)); \t} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u2026 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0435\u0433\u043e \u0444\u0430\u0431\u0440\u0438\u043a\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">8 \u0444\u0435\u0440\u0437\u0435\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"diff\">\tprivate void test_queens(String size) throws Exception { \t\tTransformerFactory tf = TransformerFactory.newInstance(); +\t\ttf.setURIResolver(new Resolver()); \t    if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { \t        SAXTransformerFactory stf = (SAXTransformerFactory)tf;\t   \t        TransformerHandler solve  = stf.newTransformerHandler(new StreamSource(&quot;xsl\/queens.xsl&quot;)); \t        TransformerHandler filter = stf.newTransformerHandler(); \t        TransformerHandler view   = stf.newTransformerHandler(); \t        Result result = new StreamResult(new File(&quot;xml\/result.html&quot;)); \t         \t        solve.setResult(new SAXResult(filter)); \t        filter.setResult(new SAXResult(view)); \t        view.setResult(result); \t\t\tgenerateData(solve, size); \t    } else { \t    \tthrow new Exception(&quot;Can''t support SAXSource or SAXResult&quot;); \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 xsl-\u0444\u0430\u0439\u043b\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430, XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u0441\u0430\u043c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b, \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e XSLT-\u043a\u043e\u0434 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u0437 LOB-\u043f\u043e\u043b\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445!<\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<h4>\u0427\u0442\u043e \u043d\u0430\u043c \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c?<\/h4>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438, \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430. \u041e\u043d \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0435\u043d, \u043d\u043e \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445 (\u0431\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0438\u043b\u0438\u044f). \u0421\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0435\u0433\u043e, \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u043e. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0430\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d XSLT. \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">count.xsl<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt;   &lt;xsl:stylesheet    xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;    version=&quot;1.0&quot;&gt;    &lt;xsl:template match=&quot;result&quot;&gt;     &lt;result&gt;       &lt;xsl:value-of select=&quot;count(position)&quot;\/&gt;      &lt;\/result&gt;   &lt;\/xsl:template&gt;  &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u2026 \u043b\u0438\u0431\u043e, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0445 \u0432 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">boards.xsl<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt;   &lt;xsl:stylesheet    xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;    xmlns:redirect=&quot;http:\/\/xml.apache.org\/xalan\/redirect&quot;   extension-element-prefixes=&quot;redirect&quot;   version=&quot;1.0&quot;&gt;  &lt;xsl:output method=&quot;html&quot;\/&gt;    &lt;xsl:template match=&quot;\/result\/position&quot;&gt;     &lt;a href=&quot;{concat(. , '.html')}&quot;&gt;       &lt;xsl:value-of select=&quot;.&quot;\/&gt;     &lt;\/a&gt;&lt;br\/&gt;     &lt;redirect:write select=&quot;concat('xml\/', . , '.html')&quot;&gt;       &lt;style&gt;       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;       }       &lt;\/style&gt;       &lt;table border=&quot;1&quot; style=&quot;border-collapse:collapse&quot;&gt;         &lt;xsl:call-template name=&quot;line&quot;&gt;           &lt;xsl:with-param name=&quot;r&quot; select=&quot;.&quot;\/&gt;           &lt;xsl:with-param name=&quot;s&quot; select=&quot;string-length(.)&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/table&gt;     &lt;\/redirect:write&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;line&quot;&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:param name=&quot;s&quot;\/&gt;     &lt;xsl:if test=&quot;string-length($r) != 0&quot;&gt;       &lt;xsl:variable name=&quot;x&quot; select=&quot;substring($r,1,1)&quot;\/&gt;       &lt;tr&gt;         &lt;xsl:call-template name=&quot;col&quot;&gt;           &lt;xsl:with-param name=&quot;x&quot; select=&quot;$x&quot;\/&gt;           &lt;xsl:with-param name=&quot;i&quot; select=&quot;$s&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/tr&gt;       &lt;xsl:call-template name=&quot;line&quot;&gt;         &lt;xsl:with-param name=&quot;r&quot; select=&quot;substring($r,2)&quot;\/&gt;         &lt;xsl:with-param name=&quot;s&quot; select=&quot;$s&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:if&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;col&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:param name=&quot;i&quot;\/&gt;     &lt;xsl:if test=&quot;$i != 0&quot;&gt;       &lt;xsl:choose&gt;         &lt;xsl:when test=&quot;$x = $i&quot;&gt;&lt;td class=&quot;active&quot;\/&gt;&lt;\/xsl:when&gt;         &lt;xsl:otherwise&gt;&lt;td\/&gt;&lt;\/xsl:otherwise&gt;       &lt;\/xsl:choose&gt;       &lt;xsl:call-template name=&quot;col&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$x&quot;\/&gt;         &lt;xsl:with-param name=&quot;i&quot; select=&quot;$i - 1&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:if&gt;   &lt;\/xsl:template&gt;  &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/3a9\/93e\/aa9\/3a993eaa9d4a594225f5f049c4abea34.png\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 Xalan redirect:write, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0430\u0439\u043b (\u0432 XSLT 2.0, \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f). \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0430\u043a\u043e\u0433\u043e redirect-\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 SAX-\u043f\u043e\u0442\u043e\u043a, \u0447\u0442\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0435\u0433\u043e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u041c\u0430\u0433\u0438\u044f \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/h4>\n<p>  \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u0438\u0445 \u043a\u0430\u043a-\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044b \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432 \u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439?<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432 \u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u043e 8 (\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442). \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438) \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 (flip), \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 (reverse) \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0434\u043e\u0441\u043a\u0438 \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 (rotate):<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">utils.xsl<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt;   &lt;xsl:stylesheet    xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;    version=&quot;1.0&quot;&gt;    &lt;xsl:template match=&quot;result&quot;&gt;     &lt;result&gt;       &lt;xsl:apply-templates\/&gt;     &lt;\/result&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template match=&quot;position&quot;&gt;     &lt;position&gt;       &lt;xsl:value-of select=&quot;.&quot;\/&gt;     &lt;\/position&gt;     &lt;flip&gt;       &lt;xsl:call-template name=&quot;flip&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;.&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/flip&gt;     &lt;reverse&gt;       &lt;xsl:call-template name=&quot;reverse&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;.&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/reverse&gt;     &lt;rotate&gt;       &lt;xsl:call-template name=&quot;rotate&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;.&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/rotate&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;flip&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:call-template name=&quot;flip_internal&quot;&gt;       &lt;xsl:with-param name=&quot;x&quot; select=&quot;$x&quot;\/&gt;       &lt;xsl:with-param name=&quot;s&quot; select=&quot;string-length($x) + 1&quot;\/&gt;     &lt;\/xsl:call-template&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;flip_internal&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:param name=&quot;s&quot;\/&gt;     &lt;xsl:if test=&quot;string-length($x) != 0&quot;&gt;       &lt;xsl:value-of select=&quot;$s - substring($x,1,1)&quot;\/&gt;       &lt;xsl:call-template name=&quot;flip_internal&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;substring($x,2)&quot;\/&gt;         &lt;xsl:with-param name=&quot;s&quot; select=&quot;$s&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:if&gt;   &lt;\/xsl:template&gt;    &lt;!-- XSLT Cookbook By Sal Mangano http:\/\/shop.oreilly.com\/product\/9780596003722.do --&gt;   &lt;xsl:template name=&quot;reverse&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:variable name=&quot;len&quot; select=&quot;string-length($x)&quot;\/&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;$len &amp;lt; 2&quot;&gt;         &lt;xsl:value-of select=&quot;$x&quot;\/&gt;       &lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$len = 2&quot;&gt;         &lt;xsl:value-of select=&quot;substring($x,2,1)&quot;\/&gt;         &lt;xsl:value-of select=&quot;substring($x,1,1)&quot;\/&gt;       &lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;         &lt;xsl:variable name=&quot;mid&quot; select=&quot;floor($len div 2)&quot;\/&gt;         &lt;xsl:call-template name=&quot;reverse&quot;&gt;           &lt;xsl:with-param name=&quot;x&quot; select=&quot;substring($x,$mid+1,$mid+1)&quot;\/&gt;         &lt;\/xsl:call-template&gt;         &lt;xsl:call-template name=&quot;reverse&quot;&gt;           &lt;xsl:with-param name=&quot;x&quot; select=&quot;substring($x,1,$mid)&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;rotate&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:call-template name=&quot;rotate_internal&quot;&gt;       &lt;xsl:with-param name=&quot;x&quot; select=&quot;$x&quot;\/&gt;       &lt;xsl:with-param name=&quot;i&quot; select=&quot;1&quot;\/&gt;       &lt;xsl:with-param name=&quot;r&quot;\/&gt;     &lt;\/xsl:call-template&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template name=&quot;rotate_internal&quot;&gt;     &lt;xsl:param name=&quot;x&quot;\/&gt;     &lt;xsl:param name=&quot;i&quot;\/&gt;     &lt;xsl:param name=&quot;r&quot;\/&gt;     &lt;xsl:variable name=&quot;p&quot;&gt;       &lt;xsl:call-template name=&quot;index-of&quot;&gt;         &lt;xsl:with-param name=&quot;input&quot; select=&quot;$x&quot;\/&gt;         &lt;xsl:with-param name=&quot;substr&quot; select=&quot;$i&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;$p = 0&quot;&gt;         &lt;xsl:value-of select=&quot;$r&quot;\/&gt;       &lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;         &lt;xsl:call-template name=&quot;rotate_internal&quot;&gt;           &lt;xsl:with-param name=&quot;x&quot; select=&quot;$x&quot;\/&gt;           &lt;xsl:with-param name=&quot;i&quot; select=&quot;$i + 1&quot;\/&gt;           &lt;xsl:with-param name=&quot;r&quot; select=&quot;concat($p,$r)&quot;\/&gt;         &lt;\/xsl:call-template&gt;       &lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;    &lt;!-- XSLT Cookbook By Sal Mangano http:\/\/shop.oreilly.com\/product\/9780596003722.do --&gt;   &lt;xsl:template name=&quot;index-of&quot;&gt;     &lt;xsl:param name=&quot;input&quot;\/&gt;     &lt;xsl:param name=&quot;substr&quot;\/&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;contains($input,$substr)&quot;&gt;         &lt;xsl:value-of select=&quot;string-length(substring-before($input,$substr))+1&quot;\/&gt;       &lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;0&lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;  &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 reverse \u0438 index-of \u0438\u0437 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 <a href=\"http:\/\/www.proklondike.com\/books\/codingproch\/xslt_sbornik_receptov.html\">\u043a\u043d\u0438\u0433\u0438<\/a> \u0421\u044d\u043b \u041c\u0430\u043d\u0433\u0430\u043d\u043e \u00abXSLT \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432\u00bb. \u0421\u0430\u043c\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0438 preceding-sibling:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">distinct.xsl<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot;?&gt;   &lt;xsl:stylesheet    xmlns:xsl=&quot;http:\/\/www.w3.org\/1999\/XSL\/Transform&quot;    version=&quot;1.0&quot;&gt;    &lt;xsl:import href=&quot;utils.xsl&quot;\/&gt;    &lt;xsl:template match=&quot;result&quot;&gt;     &lt;result&gt;       &lt;xsl:apply-templates\/&gt;     &lt;\/result&gt;   &lt;\/xsl:template&gt;    &lt;xsl:template match=&quot;position&quot;&gt;     &lt;xsl:variable name=&quot;l&quot; select=&quot;preceding-sibling::*&quot;\/&gt;     &lt;xsl:variable name=&quot;a&quot; select=&quot;.&quot;\/&gt;     &lt;xsl:variable name=&quot;b&quot;&gt;       &lt;xsl:call-template name=&quot;flip&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$a&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:variable name=&quot;c&quot;&gt;       &lt;xsl:call-template name=&quot;reverse&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$b&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:variable name=&quot;d&quot;&gt;       &lt;xsl:call-template name=&quot;flip&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$c&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:variable name=&quot;e&quot;&gt;       &lt;xsl:call-template name=&quot;rotate&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$a&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:variable name=&quot;f&quot;&gt;       &lt;xsl:call-template name=&quot;flip&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$e&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:variable name=&quot;g&quot;&gt;       &lt;xsl:call-template name=&quot;reverse&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$f&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:variable name=&quot;h&quot;&gt;       &lt;xsl:call-template name=&quot;flip&quot;&gt;         &lt;xsl:with-param name=&quot;x&quot; select=&quot;$g&quot;\/&gt;       &lt;\/xsl:call-template&gt;     &lt;\/xsl:variable&gt;     &lt;xsl:choose&gt;       &lt;xsl:when test=&quot;$b = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$c = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$d = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$e = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$f = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$g = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:when test=&quot;$h = $l&quot;&gt;&lt;\/xsl:when&gt;       &lt;xsl:otherwise&gt;         &lt;position&gt;           &lt;xsl:value-of select=&quot;$a&quot;\/&gt;         &lt;\/position&gt;       &lt;\/xsl:otherwise&gt;     &lt;\/xsl:choose&gt;   &lt;\/xsl:template&gt;  &lt;\/xsl:stylesheet&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 XSLT 1.0, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u0434\u043d\u0438\u043c XPath \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u043d\u043e \u0432 XSLT 2.0 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u00ab\u043e\u0431\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f\u00bb \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435! \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043c\u0435\u0440\u044f\u0442\u044c\u2026<\/p>\n<h4>\u041a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435?<\/h4>\n<p>  \u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041c\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\tprivate final static String JAVAX_TRANSFORM_FACTORY = &quot;javax.xml.transform.TransformerFactory&quot;; \tprivate final static String SAXON_TRANSFORM_FACTORY = &quot;net.sf.saxon.TransformerFactoryImpl&quot;; \tprivate final static String XALAN_TRANSFORM_FACTORY = &quot;org.apache.xalan.processor.TransformerFactoryImpl&quot;;  \tprivate void test_full(String size) throws Exception { \t\tSystem.setProperty(JAVAX_TRANSFORM_FACTORY, SAXON_TRANSFORM_FACTORY); \t\tTransformerFactory tf = TransformerFactory.newInstance(); \t\ttf.setURIResolver(new Resolver()); \t    if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { \t        SAXTransformerFactory stf = (SAXTransformerFactory)tf;\t   \t        TransformerHandler solve  = stf.newTransformerHandler(new StreamSource(&quot;xsl\/queens.xsl&quot;)); \t        TransformerHandler filter = stf.newTransformerHandler(new StreamSource(&quot;xsl\/distinct.xsl&quot;)); \t        TransformerHandler view   = stf.newTransformerHandler(new StreamSource(&quot;xsl\/count.xsl&quot;)); \t        Result result = new StreamResult(new File(&quot;xml\/result.xml&quot;)); \t         \t        solve.setResult(new SAXResult(filter)); \t        filter.setResult(new SAXResult(view)); \t        view.setResult(result); \t         \t        Long timestamp = System.currentTimeMillis(); \t\t\tgenerateData(solve, size); \t\t\tSystem.out.println(&quot;Elapsed Time: &quot; + Long.toString(System.currentTimeMillis() - timestamp)); \t    } else { \t    \tthrow new Exception(&quot;Can''t support SAXSource or SAXResult&quot;); \t    } \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0430\u043c\u0435\u043d\u044f\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 SAXON_TRANSFORM_FACTORY \u043d\u0430 XALAN_TRANSFORM_FACTORY \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0433\u043e XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e (\u043f\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435) \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0438 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0432\u0435\u0440\u0441\u0438\u0439 \u0432\u0435\u0442\u043a\u0438 <a href=\"http:\/\/sourceforge.net\/projects\/saxon\/files\/Saxon-HE\/\">Saxon-HE<\/a>. \u041a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0437\u043e\u0432 TransformerFactory.newInstance() \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442! \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0434\u0438\u043d \u0438\u0437 CPU \u0443\u0442\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u043a\u043e\u0434 (\u0441\u0443\u0434\u044f \u043f\u043e \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0443) \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 SHA-2.<\/p>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u044f\u044f <a href=\"http:\/\/sourceforge.net\/projects\/saxon\/files\/Saxon-B\/9.1.0.8\/\">\u0432\u0435\u0440\u0441\u0438\u044f<\/a> \u0438\u0437 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0442\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0412\u043e\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/75b\/f3e\/801\/75bf3e80166297d877ef7628ddd335ee.png\" alt=\"image\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e8c\/f9f\/2a4\/e8cf9f2a475faf41dfd2b455b74d3e92.png\" alt=\"image\"\/><\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e, \u0432 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435, \u043e\u0431\u0430 XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Saxon \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 XSLT 2.0 \u0438\u043b\u0438 XSLT 3.0.<\/p>\n<p>  \u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u044b, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0432\u044b\u043b\u043e\u0436\u0435\u043d\u044b \u043d\u0430 <a href=\"https:\/\/github.com\/GlukKazan\/XSLT_Queens\">GitHub<\/a>.<\/p>\n<p>  \u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u0445\u043e\u0447\u0443 \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/users\/jonic\/\" class=\"user_link\">jonic<\/a> \u0437\u0430 \u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0438\u043c \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.      \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/203004\/\"> http:\/\/habrahabr.ru\/post\/203004\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" align=\"left\" src=\"http:\/\/habr.habrastorage.org\/post_images\/bc5\/fea\/674\/bc5fea6746e919f2eda0823e322fcd7d.png\"\/><br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/XSLT\">XSLT<\/a>. \u042d\u0442\u043e\u0442, \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439, \u044f\u0437\u044b\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c XML-\u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u043a\u043e\u043b\u044c \u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0434\u0432\u0443\u0445 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 (\u0432 \u0441\u0440\u0435\u0434\u0435 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 XSLT-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 Java-\u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%B2%D0%BE%D1%81%D1%8C%D0%BC%D0%B8_%D1%84%D0%B5%D1%80%D0%B7%D1%8F%D1%85\">\u0437\u0430\u0434\u0430\u0447\u0443<\/a> \u043e \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 8-\u043c\u0438 \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0435. <\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c XSLT \u0432\u0440\u044f\u0434 \u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u043e\u043f\u0438\u043a \u043f\u043e\u043c\u0435\u0449\u0435\u043d \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b. \u0412 \u0442\u043e-\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0447\u0435\u0431\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-203004","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/203004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=203004"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/203004\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=203004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=203004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}