2016-08-17 16 views
0

背景と同じように、XMLフラグメントを取り込んでこれをXSLテンプレートで処理してHTML出力を得るアプリケーションがあります。Internet ExplorerでXSLプロセッサを使用した改行を追加する

これはIEで動作するように取得するために、私は、コードブロックを追加しました:

この記事の礼儀だった
var ua = window.navigator.userAgent; 
     var msie = ua.indexOf("MSIE "); 
     if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) { 
      var xslt = new ActiveXObject("Msxml2.XSLTemplate"); 
      var zxsl_activex = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); 
      zxsl_activex.async = false; 
      zxsl_activex.load("/ZymonicBlockCombined.xsl"); 
      xslt.stylesheet = zxsl_activex; 
      var xsl_proc = xslt.createProcessor(); 
      if (xml instanceof Document) { xsl_proc.input = xml; } 
      else { xsl_proc.input = xml.ownerDocument; } 
      xsl_proc.transform(); 
      return document.createRange().createContextualFragment(xsl_proc.output); 

Object doesn't support property or method 'transformNode' in Internet Explorer 10 (Windows 8)

私はこれを持っている問題があることですフラグメント(xsl_proc.output)に変換された文字列にはランダムな改行があります。この改行は、そのtransform()関数の途中で追加する必要があります。

alidationResults.push(basic_validation( "1453_dept_id"、 "エリア

2桁のID"、 "CHAR"、 ""、:あなたは、コンソールに文字列を表示する場合たとえば、それはこのようになります2は、[「[[DISPLAY_NAME]]

もちろんこれの意味するところは、ブラウザがページにこのフラグメントを挿入し、スクリプトを実行しようとしたとき、あなたは 『終了していません文字列定数』エラーが出るということである。

質問:変換()関数が余分な改行を追加しないようにする方法はありますか?

私は、入力XMLオブジェクトにはこれらの改行がなく、FireFox XSLTProcessorからの出力もないことを指摘したいと思います。

また、文字列から改行を取り除くことも試みましたが(それはかなり簡単です)、もちろん、改行が '元の' xmlに含まれていたのか、それとも追加のものであったのかを判断する方法はありません。そうすることもできません。

EDIT:

次のように完全な「変換」方法は次のとおりです。私が知っている

function TransformXML(xml) { 

var xsl = window.zxsl; 
// FireFox, Safari, Chrome, Opera etc. 
if (typeof (XSLTProcessor) != "undefined") { 
    var xslt_processor = new XSLTProcessor(); 
    xslt_processor.importStylesheet(xsl); 
    return xslt_processor.transformToFragment(xml, document); 
} 

// IE8 and below 
if (typeof (xml.transformNode) != "undefined") { 
    return xml.transformNode(xsl); 
} 

// IE9 onwards 
else { 
    try { 
     // This checks for all versions of IE up to 11, may need to change in future 
     var ua = window.navigator.userAgent; 
     var msie = ua.indexOf("MSIE "); 
     if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) { 
      var xslt = new ActiveXObject("Msxml2.XSLTemplate"); 
      var zxsl_activex = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); 
      zxsl_activex.async = false; 
      zxsl_activex.load("/ZymonicBlockCombined.xsl"); 
      xslt.stylesheet = zxsl_activex; 
      var xsl_proc = xslt.createProcessor(); 
      if (xml instanceof Document) { xsl_proc.input = xml; } 
      else { xsl_proc.input = xml.ownerDocument; } 
      xsl_proc.transform(); 
      return document.createRange().createContextualFragment(xsl_proc.output); 
     } 
    } 
    catch (e) { 
     alert("The type [XSLTProcessor] and the function [XmlDocument.transformNode] are not supported by this browser, can't transform XML document to HTML string!"); 
     return null; 
    } 
} 
} 

特に役に立たなかった、私はそれのためjsFiddleを設定しようとしたが、残念ながらそれはActiveXObjectsをサポートしていません。だから私は他の情報をどのように提供するか分からない。

XMLは単なる一般的なフラグメントである:

<report expanded="true" group_ident="ebex_performance_filter_zztlg" has_headers="true" ident="277_ebex_performance_filter_zztlg" block_id="277" blockid="277" filter_ident="277_ebex_performance_filter_"> 
<result ident="277_ebex_performance_filter_zztlg_0_result"> 
<report expanded="false" group_ident="277_ebex_performance_filter_epf_all_g" ident="277_ebex_performance_filter_zztlg_0_result_epf_all_g" result_count="0"> 
<navigation current_page="1" first_page="1" last_page="1" next_page="1" previous_page="1" results_per_page="1"> 
<error>Maximum number of results allowed is 1.</error> 
</navigation> 
</report> 
<zz_top_level_group_field DisplayOnly="true" DisplayOrder="1" LinkField="true" ReportMode="true" ident="277_ebex_performance_filter_zztlg_0_result_field" type="Field"> 
<DisplayName>All</DisplayName> 
</zz_top_level_group_field> 
</result> 
</report> 

同様に、任意のXSLファイル/フラグメントは、それを再作成するでしょう(問題がxsl_proc.transformであるので、())。

+0

は、私たちが問題を再現することができ、最小限のが、完全なコードスニペットを追加することを検討してください。 –

+0

ここには、見えないコードでバグを発見することに華麗な人がいますが、私はそれらのひとりではありません。 –

答えて

0

今後このページにアクセスしている可能性のある人は、ついに自分で問題を解決しました。 この記事から、変換する前にxmlの 'preserveWhiteSpace'プロパティをtrueに設定する必要があることが分かりました。 (私の受信したXMLドキュメントまたはオブジェクトのいずれかである

var xmlDoc = new ActiveXObject('Msxml2.DOMDocument.6.0'); 
xmlDoc.async = false; 
var xmlFragment = ((xml instanceof Document) ? xml : xml.ownerDocument); 
xmlDoc.loadXML(new XMLSerializer().serializeToString(xmlFragment)); 

注:私はあなたがActiveXObjectのが必要なので、私は1つを作成し、その中に私のXMLをロードすることを見つけ、これを行うためには Why does XSLT add newline (carriage return) in IE10

したがって三項条件)、そして私はこれをxml axtivexオブジェクトにロードされる文字列にシリアライズしました。

コードは次のようになります(と私はそれが何をする必要があるかない):

 var ua = window.navigator.userAgent; 
     var msie = ua.indexOf("MSIE "); 
     if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) { 
      var xslt = new ActiveXObject("Msxml2.XSLTemplate"); 
      var zxsl_activex = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); 
      zxsl_activex.async = false; 
      zxsl_activex.load("/ZymonicBlockCombined.xsl"); 
      xslt.stylesheet = zxsl_activex; 
      var xmlDoc = new ActiveXObject('Msxml2.DOMDocument.6.0'); 
      xmlDoc.async = false; 
      xmlDoc.preserveWhiteSpace = true; 
      var xmlFragment = ((xml instanceof Document) ? xml : xml.ownerDocument); 
      xmlDoc.loadXML(new XMLSerializer().serializeToString(xmlFragment)); 
      var xsl_proc = xslt.createProcessor(); 
      xsl_proc.input = xmlDoc; 
      xsl_proc.transform(); 
      return document.createRange().createContextualFragment(xsl_proc.output); 
     } 
関連する問題