JavaScriptをXSLTに追加

親愛なるhabrazhitelこんにちは!

私の小さなプロジェクトを紹介したいと思いますが、それは多くの人に役立つと思います。 XSRは、XSLTコードでJavaScriptを直接使用できるようにするSaxonプロセッサーのXSLT拡張機能です。 だから私たちが持っているもの:

それでは、インストールに直接進んで、実際の例ですべてを表示するために使用しましょう。 始めるには、このページで私の工芸品の主な特徴を知ることができます: 説明(英語)



インストールと構成について簡単に

拡張機能を使用するには、次の名前空間定義をXSLTドキュメントのルート要素に追加する必要があります。

xmlns:xsr="java:/xsr.XSRElementFactory"







次に、 extension-element-prefixes="xsr"



追加します-つまり ルート要素の属性リストへ。 この命令は、xsrプレフィックスが外部拡張を定義することをSaxonに伝えます。 つまり、上記の操作の後、ルート要素は次のようになります。

< xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









< xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









< xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









xsr:スクリプトステートメントの使用



xsrを定義して使用するには、スクリプトの2つの方法があります。

まず、href属性を使用して、外部JavaScriptファイルに接続(およびすぐに実行)できます。 このように:

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script defined in external file --> <br> < xsr:script href ="test.js" /> <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script defined in external file --> <br> < xsr:script href ="test.js" /> <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script defined in external file --> <br> < xsr:script href ="test.js" /> <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









このコードは、外部のtest.jsファイル(ドキュメントの場所を基準に配置する必要があります)をxslドキュメントに接続して実行します。



次に、この簡単な方法で、XSLTドキュメントにJavaScriptコードを直接記述できます。

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- simple script --> <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message('The Obligatory Hello World Example:');<br> message('HELLO WORLD!');<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- simple script --> <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message('The Obligatory Hello World Example:');<br> message('HELLO WORLD!');<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- simple script --> <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message('The Obligatory Hello World Example:');<br> message('HELLO WORLD!');<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









xsrを使用してスクリプトにパラメーターを渡す:with-param



場合によっては、外部で宣言されたパラメーターをJavaScriptコードに渡す必要があります。 これらの目的のために、特別な命令xsr:with-paramを使用できます。 例:

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- simple script --> <br> < xsr:script > <br> < xsr:with-param name ="foo" select ="string('bar')" /> <br> < xsr:with-param name ="bar" select ="local-name(.)" /> <br> < xsr:body ><! [CDATA[<br> message('foo is:', getParam('foo'));<br> message('bar is:', getParam('bar'));<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- simple script --> <br> < xsr:script > <br> < xsr:with-param name ="foo" select ="string('bar')" /> <br> < xsr:with-param name ="bar" select ="local-name(.)" /> <br> < xsr:body ><! [CDATA[<br> message('foo is:', getParam('foo'));<br> message('bar is:', getParam('bar'));<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- simple script --> <br> < xsr:script > <br> < xsr:with-param name ="foo" select ="string('bar')" /> <br> < xsr:with-param name ="bar" select ="local-name(.)" /> <br> < xsr:body ><! [CDATA[<br> message('foo is:', getParam('foo'));<br> message('bar is:', getParam('bar'));<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









注意! 現時点では、記述された方法でスクリプトに転送されたすべてのものは自動的に文字列に変換されるため、この方法でXMLドキュメントのフラグメントを転送することはできません。



XSL要素を使用したXSR:Bodyの使用



JavaScriptコードが次のようにオンザフライで生成される状況を作成することにより、JavaScriptとXSLTを混在させることができます。

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script generate itself --> <br> < xsr:script > <br> < xsr:body > <br> message('\r');<br> message('Script generate itself:');<br> < xsl:for-each select ="1 to 5" > <br> message('position() = ' + < xsl:value-of select ="position()" /> );<br> </ xsl:for-each > <br> </ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script generate itself --> <br> < xsr:script > <br> < xsr:body > <br> message('\r');<br> message('Script generate itself:');<br> < xsl:for-each select ="1 to 5" > <br> message('position() = ' + < xsl:value-of select ="position()" /> );<br> </ xsl:for-each > <br> </ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script generate itself --> <br> < xsr:script > <br> < xsr:body > <br> message('\r');<br> message('Script generate itself:');<br> < xsl:for-each select ="1 to 5" > <br> message('position() = ' + < xsl:value-of select ="position()" /> );<br> </ xsl:for-each > <br> </ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









JavaScriptを使用して結果のXMLドキュメントを生成する



JavaScriptを使用して結果のXMLドキュメントを生成するには、次の例を使用します。

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script that produces simple XML document as a result --> <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message();<br> startElement('test');<br> for (var c = 0; c < 10; c++) {<br> startElement('item_' + c);<br> characters('value_' + c);<br> endElement();<br> }<br> endElement();<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script that produces simple XML document as a result --> <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message();<br> startElement('test');<br> for (var c = 0; c < 10; c++) {<br> startElement('item_' + c);<br> characters('value_' + c);<br> endElement();<br> }<br> endElement();<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> <!-- script that produces simple XML document as a result --> <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message();<br> startElement('test');<br> for (var c = 0; c < 10; c++) {<br> startElement('item_' + c);<br> characters('value_' + c);<br> endElement();<br> }<br> endElement();<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









生成されたXMLドキュメント:

< test > <br> < item_0 > value_0 </ item_0 > <br> < item_1 > value_1 </ item_1 > <br> < item_2 > value_2 </ item_2 > <br> < item_3 > value_3 </ item_3 > <br> < item_4 > value_4 </ item_4 > <br> < item_5 > value_5 </ item_5 > <br> < item_6 > value_6 </ item_6 > <br> < item_7 > value_7 </ item_7 > <br> < item_8 > value_8 </ item_8 > <br> < item_9 > value_9 </ item_9 > <br> </ test > <br><br> * This source code was highlighted with Source Code Highlighter .









< test > <br> < item_0 > value_0 </ item_0 > <br> < item_1 > value_1 </ item_1 > <br> < item_2 > value_2 </ item_2 > <br> < item_3 > value_3 </ item_3 > <br> < item_4 > value_4 </ item_4 > <br> < item_5 > value_5 </ item_5 > <br> < item_6 > value_6 </ item_6 > <br> < item_7 > value_7 </ item_7 > <br> < item_8 > value_8 </ item_8 > <br> < item_9 > value_9 </ item_9 > <br> </ test > <br><br> * This source code was highlighted with Source Code Highlighter .









< test > <br> < item_0 > value_0 </ item_0 > <br> < item_1 > value_1 </ item_1 > <br> < item_2 > value_2 </ item_2 > <br> < item_3 > value_3 </ item_3 > <br> < item_4 > value_4 </ item_4 > <br> < item_5 > value_5 </ item_5 > <br> < item_6 > value_6 </ item_6 > <br> < item_7 > value_7 </ item_7 > <br> < item_8 > value_8 </ item_8 > <br> < item_9 > value_9 </ item_9 > <br> </ test > <br><br> * This source code was highlighted with Source Code Highlighter .









JavaScriptコードでJavaクラスを使用する



JavaScriptコードでは、次のようにJavaクラスを使用できます。

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> function buildDirectoryTree(sRootDirectory, sTrimDirectory) {<br> var aResultTree = [];<br> var aFiles = (new Packages.java.io.File(sRootDirectory)).listFiles();<br> for (var iFile = 0; iFile < aFiles.length; iFile++) {<br> var sFileName = String(aFiles[iFile]);<br> var bIsDirectory = aFiles[iFile].isDirectory();<br> if (!bIsDirectory) {<br> aResultTree.push(sFileName.substr((<br> sTrimDirectory ?<br> sTrimDirectory :<br> sRootDirectory<br> ).length));<br> } else {<br> aResultTree = aResultTree.concat(<br> buildDirectoryTree(<br> sFileName,<br> sRootDirectory<br> )<br> );<br> }<br> }<br> return aResultTree;<br> }<br> // Build directory tree<br> var aDirectoryTree = buildDirectoryTree('.');<br> for (var c = 0; c < aDirectoryTree.length; c++) {<br> message('Found directory:', aDirectoryTree[c]);<br> }<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> function buildDirectoryTree(sRootDirectory, sTrimDirectory) {<br> var aResultTree = [];<br> var aFiles = (new Packages.java.io.File(sRootDirectory)).listFiles();<br> for (var iFile = 0; iFile < aFiles.length; iFile++) {<br> var sFileName = String(aFiles[iFile]);<br> var bIsDirectory = aFiles[iFile].isDirectory();<br> if (!bIsDirectory) {<br> aResultTree.push(sFileName.substr((<br> sTrimDirectory ?<br> sTrimDirectory :<br> sRootDirectory<br> ).length));<br> } else {<br> aResultTree = aResultTree.concat(<br> buildDirectoryTree(<br> sFileName,<br> sRootDirectory<br> )<br> );<br> }<br> }<br> return aResultTree;<br> }<br> // Build directory tree<br> var aDirectoryTree = buildDirectoryTree('.');<br> for (var c = 0; c < aDirectoryTree.length; c++) {<br> message('Found directory:', aDirectoryTree[c]);<br> }<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> function buildDirectoryTree(sRootDirectory, sTrimDirectory) {<br> var aResultTree = [];<br> var aFiles = (new Packages.java.io.File(sRootDirectory)).listFiles();<br> for (var iFile = 0; iFile < aFiles.length; iFile++) {<br> var sFileName = String(aFiles[iFile]);<br> var bIsDirectory = aFiles[iFile].isDirectory();<br> if (!bIsDirectory) {<br> aResultTree.push(sFileName.substr((<br> sTrimDirectory ?<br> sTrimDirectory :<br> sRootDirectory<br> ).length));<br> } else {<br> aResultTree = aResultTree.concat(<br> buildDirectoryTree(<br> sFileName,<br> sRootDirectory<br> )<br> );<br> }<br> }<br> return aResultTree;<br> }<br> // Build directory tree<br> var aDirectoryTree = buildDirectoryTree('.');<br> for (var c = 0; c < aDirectoryTree.length; c++) {<br> message('Found directory:', aDirectoryTree[c]);<br> }<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









Javaの標準部分ではないクラスを使用することもできます。 次の例は、SQLiteJDBC(http://www.zentus.com/sqlitejdbc/)を使用してSQLiteデータベースに接続して操作する方法を示しています。

<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> function SQLite() {<br> Packages.java.lang.Class.forName('org.sqlite.JDBC');<br> this.connection = null;<br> this.connect = function(sDBFileName) {<br> this.connection = new Packages.java.sql.DriverManager.getConnection(<br> 'jdbc:sqlite:' + sDBFileName<br> );<br> this.statement = this.connection.createStatement();<br> };<br> this.close = function() {<br> if (!this.connection) return;<br> this.connection.close();<br> this.statement.close();<br> this.connection = null;<br> this.statement = null;<br> };<br> this.query = function(sQuery) {<br> if (!this.statement) return;<br> var aResultSet = [];<br> try {<br> var oResultSet = this.statement.executeQuery(sQuery);<br> } catch (e) {}<br> if (oResultSet) {<br> while (oResultSet.next()) {<br> var aRowData = {};<br> for (var c = 1; c < = oResultSet.columnCount; c++) {<br> var sColumnName = oResultSet.getColumnName(c);<br> aRowData[sColumnName] = oResultSet.getString(<br> sColumnName<br> );<br> }<br> aResultSet.push(aRowData);<br> }<br> oResultSet.close();<br> }<br> return aResultSet;<br> };<br> };<br> ]] ></ xsr:body > <br> </ xsr:script > <br><br> <!-- let's do something interesting with our database now --> <br><br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message('SQLite example:\r\n');<br> var oSQLite = new SQLite();<br> oSQLite.connect('test.db');<br> oSQLite.query('\<br> CREATE TABLE if not exists test_table (\<br> id INTEGER PRIMARY KEY AUTOINCREMENT,\<br> name TEXT\<br> );\<br> ');<br> for (var c = 0; c < 100; c++) {<br> oSQLite.query('INSERT INTO test_table (name) VALUES ("item_'+c+'")');<br> }<br> var aResult = oSQLite.query('SELECT * FROM test_table;');<br> for (var c = 0; c < aResult.length; c++) {<br> startElement('row');<br> for (var sCellName in aResult[c]) {<br> startElement(sCellName);<br> characters(aResult[c][sCellName]);<br> endElement();<br> }<br> endElement();<br> }<br> oSQLite.query('DROP TABLE test_table');<br> oSQLite.close();<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> function SQLite() {<br> Packages.java.lang.Class.forName('org.sqlite.JDBC');<br> this.connection = null;<br> this.connect = function(sDBFileName) {<br> this.connection = new Packages.java.sql.DriverManager.getConnection(<br> 'jdbc:sqlite:' + sDBFileName<br> );<br> this.statement = this.connection.createStatement();<br> };<br> this.close = function() {<br> if (!this.connection) return;<br> this.connection.close();<br> this.statement.close();<br> this.connection = null;<br> this.statement = null;<br> };<br> this.query = function(sQuery) {<br> if (!this.statement) return;<br> var aResultSet = [];<br> try {<br> var oResultSet = this.statement.executeQuery(sQuery);<br> } catch (e) {}<br> if (oResultSet) {<br> while (oResultSet.next()) {<br> var aRowData = {};<br> for (var c = 1; c < = oResultSet.columnCount; c++) {<br> var sColumnName = oResultSet.getColumnName(c);<br> aRowData[sColumnName] = oResultSet.getString(<br> sColumnName<br> );<br> }<br> aResultSet.push(aRowData);<br> }<br> oResultSet.close();<br> }<br> return aResultSet;<br> };<br> };<br> ]] ></ xsr:body > <br> </ xsr:script > <br><br> <!-- let's do something interesting with our database now --> <br><br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message('SQLite example:\r\n');<br> var oSQLite = new SQLite();<br> oSQLite.connect('test.db');<br> oSQLite.query('\<br> CREATE TABLE if not exists test_table (\<br> id INTEGER PRIMARY KEY AUTOINCREMENT,\<br> name TEXT\<br> );\<br> ');<br> for (var c = 0; c < 100; c++) {<br> oSQLite.query('INSERT INTO test_table (name) VALUES ("item_'+c+'")');<br> }<br> var aResult = oSQLite.query('SELECT * FROM test_table;');<br> for (var c = 0; c < aResult.length; c++) {<br> startElement('row');<br> for (var sCellName in aResult[c]) {<br> startElement(sCellName);<br> characters(aResult[c][sCellName]);<br> endElement();<br> }<br> endElement();<br> }<br> oSQLite.query('DROP TABLE test_table');<br> oSQLite.close();<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









<? xml version ="1.0" encoding ="UTF-8" ? > <br> < xsl:stylesheet version ="2.0" <br> xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" <br> xmlns:xsr ="java:/xsr.XSRElementFactory" <br> extension-element-prefixes ="xsr" > <br><br> < xsl:output method ="xml" indent ="yes" omit-xml-declaration ="yes" /> <br><br> < xsl:template match ="//*" > <br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> function SQLite() {<br> Packages.java.lang.Class.forName('org.sqlite.JDBC');<br> this.connection = null;<br> this.connect = function(sDBFileName) {<br> this.connection = new Packages.java.sql.DriverManager.getConnection(<br> 'jdbc:sqlite:' + sDBFileName<br> );<br> this.statement = this.connection.createStatement();<br> };<br> this.close = function() {<br> if (!this.connection) return;<br> this.connection.close();<br> this.statement.close();<br> this.connection = null;<br> this.statement = null;<br> };<br> this.query = function(sQuery) {<br> if (!this.statement) return;<br> var aResultSet = [];<br> try {<br> var oResultSet = this.statement.executeQuery(sQuery);<br> } catch (e) {}<br> if (oResultSet) {<br> while (oResultSet.next()) {<br> var aRowData = {};<br> for (var c = 1; c < = oResultSet.columnCount; c++) {<br> var sColumnName = oResultSet.getColumnName(c);<br> aRowData[sColumnName] = oResultSet.getString(<br> sColumnName<br> );<br> }<br> aResultSet.push(aRowData);<br> }<br> oResultSet.close();<br> }<br> return aResultSet;<br> };<br> };<br> ]] ></ xsr:body > <br> </ xsr:script > <br><br> <!-- let's do something interesting with our database now --> <br><br> < xsr:script > <br> < xsr:body ><! [CDATA[<br> message('SQLite example:\r\n');<br> var oSQLite = new SQLite();<br> oSQLite.connect('test.db');<br> oSQLite.query('\<br> CREATE TABLE if not exists test_table (\<br> id INTEGER PRIMARY KEY AUTOINCREMENT,\<br> name TEXT\<br> );\<br> ');<br> for (var c = 0; c < 100; c++) {<br> oSQLite.query('INSERT INTO test_table (name) VALUES ("item_'+c+'")');<br> }<br> var aResult = oSQLite.query('SELECT * FROM test_table;');<br> for (var c = 0; c < aResult.length; c++) {<br> startElement('row');<br> for (var sCellName in aResult[c]) {<br> startElement(sCellName);<br> characters(aResult[c][sCellName]);<br> endElement();<br> }<br> endElement();<br> }<br> oSQLite.query('DROP TABLE test_table');<br> oSQLite.close();<br> ]] ></ xsr:body > <br> </ xsr:script > <br> </ xsl:template > <br> </ xsl:stylesheet > <br><br> * This source code was highlighted with Source Code Highlighter .









おわりに



なぜこれがすべて必要なのか疑問に思うかもしれません。 その答えは非常にシンプルです。XSLTとXMLは非常に強力な束であり、非常に多くのタスクを実行できます。JavaScriptとApache Antを使用してコマンドラインから簡単に実行できる機能を追加すると、最終結果を生成するメカニズムが既に組み込まれた強力な自動化ツールが得られます。 さまざまなアプリケーションタスクを実行するJavaScript用に大量のコードが記述されているという事実を考慮すると、このプロジェクト(少なくとも私にとって)はもはやそれほどおかしくはありません。

より現実的な例:HTTPプロトコルを介して外部リソースを引き裂き、このテキストを使用してXMLレポートをデータベースまたは別のサーバーにドロップできるように、何かを記述する必要があります。



これがHabréに関する私の最初のトピックです;したがって、建設的な批判は大歓迎です。 また、このトピックがあなたの興味を引くものであるかどうか、コミュニティから知りたいのですが、近いうちに似たようなものを公開する必要がありますか?



参照資料




All Articles