背景と同じように、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であるので、())。
は、私たちが問題を再現することができ、最小限のが、完全なコードスニペットを追加することを検討してください。 –
ここには、見えないコードでバグを発見することに華麗な人がいますが、私はそれらのひとりではありません。 –