私の小さなプロジェクトを紹介したいと思いますが、それは多くの人に役立つと思います。 XSRは、XSLTコードでJavaScriptを直接使用できるようにするSaxonプロセッサーのXSLT拡張機能です。 だから私たちが持っているもの:
- Saxon XSLTプロセッサーは、最新のXSLT 2を使用したい人にとっては妥当な選択であり、私の知る限り、最も完全な実装はSaxon'eのみです。
 - Mozilla Rhino JavaScriptエンジンは、基本的にJavaで記述された仮想JavaScriptマシンです。
 - Apache antビルドツールは、主に日常的な操作を自動化するために使用されます(たとえば、すべてのファイルを自動的に圧縮した後、リモートサーバーにアプリケーションをデプロイします...
 - すべてをまとめてXSLTランタイムでJavaScriptを機能させたいという願望
 
インストールと構成について簡単に
- ANTがインストールされていない場合は、 ここの例の説明を読んでこれを行います
 - ここからトランクを取り出してください 。 NetBeans、ソース、バイナリ、テストの下にプロジェクトがあります。 すぐに予約を入れてください、私はJavaプログラマーではありません。したがって、この分野の専門家である皆さんの側からの私のコードは、うーん...おかしいですか?
 - テストフォルダーに移動し、build.xmlファイルのパスが正しいことを確認します
 - 同じフォルダーtestでコンソールに移動し、 antを記述して、ファイルtest.xsl / test.jsのサンプルがどのように実行されるかを確認します
 
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éに関する私の最初のトピックです;したがって、建設的な批判は大歓迎です。 また、このトピックがあなたの興味を引くものであるかどうか、コミュニティから知りたいのですが、近いうちに似たようなものを公開する必要がありますか?
参照資料
- プロジェクトホームページ: http : //code.google.com/p/xsr/
 - Mozilla Rhino JSエンジンについては、 http : //www.mozilla.org/rhino/をご覧ください。
 - XSLT2のドキュメントは、 http : //www.saxonica.com/documentation/index.htmlおよびhttp://www.zvon.org/xxl/XSL-Ref/Tutorials/index.htmlにあります。
 - Saxon-拡張機能のメカニズムに関連するドキュメントは、 http : //www.saxonica.com/documentation/extensibility/intro.htmlから入手できます。