2017-07-10 5 views
0

私はいくつかのデータベースの内容を視覚化するアプリケーションを作成しています。このアプリケーションは、インストールと使用ができるだけ簡単でなければならないので、XMLファイルをデータベースとして使用し、ブラウザを通じてXSLで適切に変換することに決めました。現在、XSLファイルはすべてのデータベースの要約テーブルを作成するようにプログラムされており、各行の最初のセルをクリックすると、エントリ全体のより完全な説明が表示されます。つまり、ページにはデータベース内のすべてのレコードの完全な説明がすべて含まれていますが、この状況ではページの読み込みが遅くなります。数百レコードを読み込むには最大5秒かかります。私は今後データベースを大きく拡張する予定であるため、この問題はさらに悪化することになっています。負荷を軽減するために、次の明白なステップは、AJAXまたはiframeを使用して遅延負荷に頼ることです(問題のポイントではなく現時点では重要ではありません)が、いくつかの問題に直面しています。XML/XSLからURLパラメータを抽出する

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" version="5" doctype-system="about:legacy-compat" indent="yes" /> 
    <xsl:param name="url" /> 

    <xsl:template match="/"> 
     <html> 
      <body><xsl:value-of select="$url" /></body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

は、今のところこれはただです:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="transform.xsl"?> 
<content /> 

そしてtransform.xslビーイング:transform.xmlされた状態で

file:///path/to/file/transform.xml?id=23 

:私の考えは、直接このようなXMLファイルを呼び出すことでした概念の証明ですが、この部分は後続のすべての基礎であり、それがうまくいかない場合、この方法をさらに進めることは無意味です。

私はこの時点で空白のページが見えます。また、パラメータ名をidに変更しようとしましたが、ページは空のままです。

これはPHPやその他のサーバー側のソリューションで簡単に実現できますが、MySQLの方が効率的ですが、ダウンロードが終了するとすぐにこのアプリケーションを使用する必要があります。ユーザーが* AMPサーバーをインストールする必要がある場合、おそらくそうではありません。私はこのアプリケーションをオフラインで実行する必要があるので、パブリックサーバーも解決策ではありません。一方、JavaScript/jQueryソリューションは、クライアント側であるため、完全に受け入れられます。

編集:ほとんどの作品は、動作するようですがかなり古く、サンプルにはASPページのURLが含まれているthis questionに基づいています。

答えて

0

URLパラメータをXSLに渡すことは実用的ではないようですので、私はAJAXで別の方法を見つけました。 JavascriptはXMLファイルとXSLファイルをインポートし、XMLファイルをフィルタリングして1つの要素のみが残るようにしてから、残りのXML構造にXSLファイルを適用します。

同様の問題でインスピレーションを求めている人は、私が使用しているコードの簡単な例を残しておきます。このコードにはjQueryが必要ですが、これは完璧に機能しません。(hereから臆面もなくコピー)

page.js:

function expand_box(id, tag_to_isolate, XML_file, XSL_file, container) { 
    if($('div#' + id).length == 0) { //first opening 
     var XML = $.ajax({url: XML_file, async: false, dataType: 'xml'}).responseXML.activeElement; 
     var XSL = $.ajax({url: XSL_file, async: false, dataType: 'xml'}).responseXML.activeElement; 
     if(XSL.getElementsByTagName('xsl:include').length == 1) { //bonus, see below* 
      var XSL_temp = $.ajax({url: 'templates.xsl', async: false, dataType: 'xml'}).responseXML.activeElement; 
      $(XSL.getElementsByTagName('xsl:include')).replaceWith(XSL_temp.childNodes); 
     } 
     XML = $(XML).find(tag_to_isolate + '[id=' + id + ']')[0]; 
     if (window.ActiveXObject) { // code for IE 
      var result = XML.transformNode(XSL); 
     } 
     else if (document.implementation && document.implementation.createDocument) { // code for Chrome, Firefox, Opera, etc. 
      var xsltProcessor = new XSLTProcessor(); 
      xsltProcessor.importStylesheet(XSL); 
      var result = xsltProcessor.transformToFragment(XML, document); 
     } 
     $('div#' + panel).append(result); 
     //other code here, e.g. to apply all jQuery functions bound to clicks, ... 
    } 
    $('#' + id).slideDown(); 
} 

*ボーナス:私はjavascriptのxsltProcessorがxsl:includeタグを扱うことができないことが分かったので、私はそれらを手動でインポートする必要がありました。このコードは、すべての共有テンプレートを含むために1つのxslファイルしか使用しないため、ここでは単純です。置換は自動的ですが、柔軟性を高めるように簡単に調整できます。

database.xml(上記図示していない同じXMLファイル):

<?xml version="1.0" encoding="UTF-8"?> 
<elements> 
    <element id="1"> 
     ... 
    </element> 
    ... 
</elements> 

がtransform.xsl:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xsl:template match="/elements/element"> 
     ... 
    </xsl:template> 
    <xsl:include href="templates.xsl" /> 
</xsl:stylesheet> 

使用するデータベースに応じて、必要に応じて、あなたはできるだけ多くの試合を作成することができます。

メインスレッドの同期AJAXリクエストは、ユーザーに悪影響を与えるため非推奨となっており、今後は無効になる可能性があるため、回答はおそらく改善される可能性がありますが、目的は、すべてが自分のコンピュータ上で起こるため、同期要求を持つことです。ファイルの大きさにかかわらず要求は高速です。リモートサーバーでは、非同期要求が必要です。

0

xml-stylesheet処理命令を使用した変換の呼び出しでは、変換にパラメータを指定する方法は提供されません。したがって、パラメータは長さゼロの文字列であるデフォルト値を使用します。

申し訳ありませんが、このデザインは飛ぶことはありません。

私はこれを行う唯一の方法は、プログラムで変換を呼び出すHTMLページにJavascriptコードを入れることだと思います。

1つの選択肢は、ブラウザが提供するXSLTエンジンに頼るのではなく、Saxon-JSを使用することです。これにより、1.0ではなくXSLT 2.0/3.0の機能にアクセスできるようになり、2.0ではスタイルシートがdocument-uri()関数を使用してソース文書のURIにアクセスできます。

+0

Saxon-JSに見られる問題は、XSLファイルのコンパイルが必要なことです。つまり、コードがクローズソースになる可能性があります。 – GRB

+0

はい、商用ツールの依存性は考慮する必要があります。 2017年に積極的に開発された商用ツールを使用するのか、2001年以降に進んでいない無料ツールを使用するのかを決める必要があります。 –