2011-09-08 16 views
0

XMLファイルの一部をHTMLテーブルの単一の行に変換するためにJavascriptを使用しようとしています。私は、複数のXMLファイルからテーブル内に複数の行を作成することを考えています。 FirefoxとOperaの場合、この素敵な小さなコードが美しく機能します。IEでフラグメントを処理するXSL

var resTable = document.createElement('table'); 

for (i = 0; i < xmlNames.length; i++) 
{ 
    // code for IE 
    if (window.ActiveXObject) 
    { 
    } 
    // code for Mozilla, Firefox, Opera, etc. 
    else if (document.implementation && document.implementation.createDocument) 
    { 
    xml=loadXMLDoc(xmlNames[i]); 
    xsl=loadXMLDoc(xslName); 
    xsltProcessor=new XSLTProcessor(); 
    xsltProcessor.importStylesheet(xsl); 
    resultDocument = xsltProcessor.transformToFragment(xml,document); 
    resTable.appendChild(resultDocument); 
    } 
} 

document.getElementById("theDoc").appendChild(resTable); 

問題は、私は、「IEの場合」の部分には千の事をしようとしたということで、何も今までに機能しません。私は尋ねる前に、たくさんのグーグルをしてブラウジングしてきましたが、役に立たないのです。実際、非常に似ているようなSOには未回答の質問がありますが、回答も解決もないので、誰かが私をここで助けてくれることを期待していました..

私はIE上で変換する文書全体が、フラグメントとしてこれをやりたいという事実は、私の問題を引き起こすものです。どんな助けでも大いに感謝されるでしょう!ありがとう!

編集:申し訳ありません重要な場合は、loadXMLDoc関数を提供するのを忘れていました。ここです:

function loadXMLDoc(dname) 
{ 
    if (window.XMLHttpRequest) 
    { 
    xhttp=new XMLHttpRequest(); 
    } 
    else 
    { 
    xhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xhttp.open("GET",dname,false); 
    xhttp.send(""); 
    return xhttp.responseXML; 
} 
+0

ActiveXフィルタリングが有効になっていても 'true'と評価される' window.ActiveXObject'でIEを検出しようとすべきではありません。後でActiveXオブジェクトを作成しようとすると失敗します。 – Joey

+0

よろしくお願いします。 – daroo

+0

http://blogs.msdn.com/b/ie/archive/2011/05/02/activex-filtering-for-developers.aspx - あなたは既にXHRに対して正しいことをしています。 – Joey

答えて

2

ずっと試行錯誤の後、私は働く何かを思い付きました。ここで私がしたことは次のとおりです。

いつものようにxsltProcessorを作成し、transformメソッドを呼び出します。これにより、xsltProcessor.outputがHTML形式の文字列になります。もちろん、DOM要素が必要なので、HTML文字列をDOMに変換する必要がありました。幸いにも、私はXSLスタイルシートの作者でもありますので、私は戻ってくることを期待しています。私の場合、出力HTML文字列は< tr> ... </tr>要素のいくつかの数になります。私は最初resTable(テーブルDOM要素)のinnerHTMLを出力文字列に設定しようとしましたが、うまくいきませんでした。私はまだ分かりませんが、< tr> sという事実とは関係があり、テーブルタグのコンテキスト外でinnerHTMLに設定すると解析できませんでした。

私は一時的なdiv要素を作成し、xsltProcessorの出力文字列が<テーブル> </table>タグで囲まれた文字列にITsのinnerHTMLを設定しました。ここでtemp div要素はDOMテーブルです。次に、これを実行して子ノード(xslプロセッサが最初に返したtrノード)を取得しました。この種のばかげすべてこれを行うには思われるが、それは動作しますが、私はそれを言うことができる初めてのthats ..ここで私がテストしたすべてのブラウザで動作し、最終的なバージョンがあります..どのように

var resTable = document.createElement('table'); 

for (i = 0; i < xmlNames.length; i++) 
{ 
    // code for IE 
    if (window.ActiveXObject) 
    { 
    var xml = new ActiveXObject("Microsoft.XMLDOM"); 
    xml.async = false; 
    xml.load(xmlNames[i]); 

    var xslt = new ActiveXObject("Msxml2.XSLTemplate"); 
    var xsl = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0"); 

    var xsltProcessor; 
    xsl.async = false; 
    xsl.resolveExternals = false; 
    xsl.load(xslName); 
    xslt.stylesheet = xsl; 

    xsltProcessor = xslt.createProcessor(); 
    xsltProcessor.input = xml; 

    //This transform results in one or more tr.../tr HTML tag(s) 
    xsltProcessor.transform(); 

    //Create a temp div element which is used to convert the HTML 
    //string to a DOM element so I can grab just the part I want.. 
    tmp = document.createElement('div'); 

    //Can't set innerHTML to tr tags directly I guess, so have to put 
    //in context of a table so it can be parsed... 
    tmp.innerHTML = "<table>" + xsltProcessor.output + "</table>"; 

    //Now I need to grad the tr children from inside the table node, since 
    //the table was only to please the parser 
    for (tmpChildInd = 0; tmpChildInd < tmp.childNodes[0].childNodes.length; tmpChildInd++) 
    { 
     //finally, append the temporary elements children (the tr tags) 
     //to the overall table I created before the loop. 
     resTable.appendChild(tmp.childNodes[0].childNodes[tmpChildInd]); 
    } 
    } 
    // code for Mozilla, Firefox, Opera, etc. 
    else if (document.implementation && document.implementation.createDocument) 
    { 
    xml=loadXMLDoc(xmlNames[i]); 
    xsl=loadXMLDoc(xslName); 
    xsltProcessor=new XSLTProcessor(); 
    xsltProcessor.importStylesheet(xsl); 
    resultDocument = xsltProcessor.transformToFragment(xml,document); 
    resTable.appendChild(resultDocument); 
    } 
} 

//put the full table at the div location "theDoc" now.. 
document.getElementById("theDoc").appendChild(resTable); 

わかりませんしばしば人々はこれをしようとしますが、うまくいけば、これは他の誰かに助けてくれるでしょう。

関連する問題