2011-07-21 3 views
0

に失敗し、私は、コードを使用しているプロジェクトに取り組んでいますFireFoxの5およびIE 8jqueryの記録のためにFireFoxの

を実行し、WindowsのXP SP3を使用しています、IEで大丈夫のXSLのxml problem..worksを変換石の時代から、それをリファクタリングしようとし、それを近代化する。それはIEでのみ機能し、XMLとXSLTを多用しています。

ページが読み込まれると、コンテンツはXSLTとXMLの前処理を使用してdiv内に動的に配置されます。このコンテンツは、img、map、inputタグで構成され、XSLファイルから取得されます。これはFirefoxとInternet Explorerの両方でうまく動作します。それは正常にロードされ、img上のusemap属性を利用して適切なマッピングで正しく表示されます。

ユーザーが別のイメージを読み込むための選択ボックスがあります。これが問題の原因です。ユーザーが選択ボックスで選択を行うと、XMLオブジェクトとXMLファイルを介してページが最初にロードされたときの手順、つまりXSLTが反映されます。基本的には、divの内容がリロードされます。

これはInternet Explorer(IE)でうまく動作します。しかし、FireFoxはまったく変換していません。

function TransformXML() 
{ 
    var html = null; 
    var XML_Image = null; 
    // Load XML document into XML_Image and do manipulation on it before transformation 
    // ... 
    // Further down in the function.. 

    if (document.implementation && document.implementation.createDocument) 
    { 
    html = $.transform({async:false, xmlobj:XML_Image, xsl:"xsl/ImageData.xsl"}); 
    document.getElementById("DivContent").appendChild(html); 
    } 
    else 
    { 
    html = $.transform({async:false, xmlobj:XML_Image, xsl:"xsl/ImageData.xsl"}); 
    document.getElementById("DivContent").innerHTML = html; 
    } 
} 

私が言ったように、IEは正常に動作します:

私はjQueryのプラグインを変換し、ここで私が使用していたコードの行がありました。残念ながら、 html変数の値は空白です(FireBugは "")。何が問題なの?

XSLファイルではXSL:importを使用しますが、jquery transformプラグインはIEで正常に動作しました。私はFireFoxがそれを好きではないかどうかはわかりませんが(FireBugはXSLTのデバッグにひどいです)。

ありがとうございました!

UPDATE

私はそれはXSLファイルで何かあると判断しました。私はサンプルのXMLとXSLファイルをjquery変換プラグインから使用してみました。その後、XMLオブジェクト、XML_Image、およびサンプルXSLファイルを使用しようとしましたが、それも機能しました。最後に、サンプルXMLファイルとXSLファイルImageData.xslを使用してみましたが、動作しませんでした。しかし、XSLファイルの何が問題なのかよく分かりません。

アップデート2

まあ、私はそれはXSLファイルで何かだと思います。ここでは、次のとおりです。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes"/> 

    <xsl:template name="chgBR"> 

    <xsl:param name="str"/> 
    <xsl:choose> 
     <xsl:when test='$str = ""'> 
     <br/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$str"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

<xsl:template name="replace"> 
    <xsl:param name="str"/> 
    <xsl:param name="src"/> 
    <xsl:param name="dst"/> 
    <xsl:if test='$str != ""'> 
    <xsl:choose> 
    <xsl:when test='substring-before($str, $src) = "" '> 
     <xsl:value-of select='$str'/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select='substring-before($str, $src)'/> 
    <xsl:choose> 
     <xsl:when test='$dst = "&lt;br/&gt;"'> 
     <xsl:element name="br"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select='$dst'/> 
     </xsl:otherwise> 
     </xsl:choose> 
     <xsl:call-template name='replace'> 
     <xsl:with-param name='str' select='substring-after($str,$src)'/> 
     <xsl:with-param name='src' select='$src'/> 
     <xsl:with-param name='dst' select='$dst'/> 
     </xsl:call-template> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:if> 
</xsl:template> 


<xsl:template match="/"> 
    <xsl:apply-templates select="Figure" /> 
</xsl:template> 

<xsl:template match="Figure"> 

    <input type="hidden" name="pdfpath" id="pdfpath"> 
    <xsl:attribute name="value">Catalog/PDF/<xsl:call-template name='replace'> 
     <xsl:with-param name='str' select='./nm_pdf'/> 
     <xsl:with-param name='src' select='" "'/> 
     <xsl:with-param name='dst' select='"%20"'/> 
     </xsl:call-template> 
    </xsl:attribute> 
    </input> 
</xsl:template> 

</xsl:stylesheet> 

Update3と

私は期待して、それは私のXMLとXSLファイルをデバッグすることができて、ブラウザの外で、それの変換を実行し、XMLエディタをダウンロードしました。 XSLファイルは大丈夫です。 XMLが何らかの形で壊れていれば、テストに戻りました。その結果、XMLエディタはXSLファイルを使用してXMLファイルを変換することができました。 XMLファイルにUTF-8としてエンコードされた英語および東アジア言語の文字が含まれていると言えます。しかし、IEはXMLエディタだけでなく、それを解析して変換することができました。だから、おそらくFirefoxはXMLファイルのUTF-8エンコーディングに問題がありますか?この問題に対する答えを持っていない

は、私はこれを試してみました:

私がやったこと
if (window.DOMParser) 
{ 
    var serializer = new XMLSerializer(); 
    var XMLString = serializer.serializeToString(XML_Image); 
    var parser = new DOMParser(); 
    var XML_Image_Again = parser.parseFromString(XMLString, "text/xml"); 
} 

var Works = $.transform({async:false, xmlobj:XML_Image_Again, xsl:"xsl/ImageData.xsl"}); 
var AlsoWorks = $.transform({async:false, xmlstr:XMLString, xsl:"xsl/ImageData.xsl"}); 

Works = Works.replace(/&quot;/g,"\""); 
Works = htmlfixed.replace(/(.gif).*?\"/g,"$1\""); 

document.getElementById("DivContent").innerHTML = Works; 

は、文字列にXMLをシリアル化しました。次に、文字列を解析し、それをXML DOMオブジェクトに変換しようとしました。何らかの理由で、文字列にとどまっていました。その結果、Worksは文字列の値をとります。 AlsoWorks *も同様に文字列の値を取りますが、これが望ましい結果です。奇妙なのは、XMLを変換してWorksに渡した後、引用符の大部分がうんざりしてしまい、取得している画像の最後にいくつかのデータが追加されました(.gif)。 は文字列なので、appendChildメソッドを使用してDOMツリーにアタッチできませんでした。私は、innerHTMLを使用する以外は選択肢がなくなりました。

私が協力しているプロジェクトは、XMLとXSLファイルで築かれているので、このすべての時間とエネルギー。

私はFirefoxとXSLT/XML/XSLと、このブログでも、文書の難しことがわかった:それは機能するようになりましたが、私はまだ私の頭を悩まてる

http://ajaxandxml.blogspot.com/search/label/Firefox

。最初は、IEでうまく動作すると言いました。そして、おそらくもっと重要なのは、BOTH FireFoxとIEで初めて動作します。これは、ページの初期化時にdivにコンテンツを追加する初めてのことです。これは、FireFoxが協力していないdivにコンテンツを添付している(そして、FirebugはIEのWeb devleoperツールバーとは異なり、あまり役に立ちませんし、エラーも報告しません)。そして、初期化時に、私はjqueryを使用せず、ネイティブDOMだけです。そして、jqueryトランスフォームプラグインのサンプルXMLとXSLファイルのペアを使用したところ、うまくいきました。 XMLファイルとXSLファイルの両方を一緒に使用すると、それが文句を言うだけです(もう一度、ページが最初に読み込まれたときではありません)。奇妙なことは、それはXMLオブジェクトを変換しないだろうが、私はそれをシリアル化した後、変換は正常に働いた。

質問が多すぎます。 XMLやXSLファイルに障害があると、ページが読み込まれても変換が失敗してしまいますが、そうではないため、恐らくFireFoxでXMLではなくXSLであると言います。

なぜオブジェクトがdivに追加されても機能しなかったのを知りたいのですが、オブジェクトを文字列にシリアル化し、変換後にフライングカラーで渡したinnerHTMLプロパティに設定することをお勧めします。

UPDATE4

私のXSLファイルで、私は別のXSLファイル内の最初の2つのテンプレートを配置し、XSLを使用しています:インポート機能を、代わりに。これは再びそれを壊した。したがって、FireFoxとjquery transformプラグインはxsl:import機能にうまく対応しません(IEには問題ありません)。私はトランスポートプラグインのサンプルXMLとXSLファイルを使用しようとしました。これはxsl:importの使い方を指定した例で、Firefoxでは失敗しました。

UPDATE5

私はそれがXSLかを調査するために、jqueryのを使用しないように、コードをリファクタリング:インポートは失敗します。

// Test for Firefox only, purposely not including IE code 
function TransformNodeTest(xmlobj, xslpath) 
{ 
    var xslobj = LoadXSML(xslpath); 
    var xsltProcessor = new XSLTProcessor(); 
    xsltProcessor.importStylesheet(xslobj); 
    return(xsltProcessor.transformToFragment(xmlobj, document)); 
} 
function LoadXSML(xslpath) 
{ 
    var xhttp=new XMLHttpRequest(); 
    xhttp.open("GET",xslpath,false); 
    xhttp.setRequestHeader("Pragma", "no-cache"); 
    xhttp.send(); 
    return xhttp.responseXML; 
} 

// ImageData.xsl contains xsl:import statement 
// XML_Image is an XML obj 
var FireFoxHTML = TransformNodeTest(XML_Image, "xsl/ImageData.xsl"); 

正常に機能しました。jQueryのプラグインを変換

content-- XML/XSLでdivの中にXML/XSLコンテンツを交換するための

結論::

IE:罰金作品。 xslファイルのインポート機能に問題はありません。

FireFox:何らかの不明な理由(私にとって)のためにxsl:import機能が嫌いです。私のストップギャップは、よりよい解決策が出るまでは、すべてのXSLステートメントを1つのファイルにコピー/ペーストし、xsl:importは使用しません。また、XML objをシリアライズし、必要に応じてXMLオブジェクトに変換して変換する必要があります。なぜシリアル化はそれを修正するのですか?私は知らない。

XML DOM ::

IE:Works fine; xslファイルのインポート機能に問題はありません。

FireFox:xsl:import機能で問題はありません。 XML objを直列化し、必要に応じて変換するXMLオブジェクトに解析し直す必要があります。なぜシリアル化はそれを修正するのですか?私は知らない。

ページを最初に読み込むと、XSLTがdivで実行され、FFとIEで正常に動作します。 FFで失敗するのはそれ以降の時だけです(ただしIEではありません)。

答えて

0

私の解決策は、XSLTを放棄し、JavaScriptでHTMLを書き込んでDOMにアタッチすることでした。ページのXSLT呼び出しが1つだった場合は、ブラウザ間の互換性を達成するためのさらなる試みを行ったと思います。タイミングとローディングの問題が原因で部分的に失敗していると思います。私は後でそれを再訪し、このスペースを更新するかもしれない。