2010-01-07 7 views
3

J'utilise le code javascript suivant pour afficher xml/xsl:javascript XSL google chrome

function loadXMLDoc(fname) 
{ 
    var xmlDoc; 
    // code for IE 
    if (window.ActiveXObject) 
    { 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    } 
    // code for Mozilla, Firefox, Opera, etc. 
    else if (document.implementation 
    && document.implementation.createDocument) 
    { 
    xmlDoc=document.implementation.createDocument("","",null); 
    } 
    else 
    { 
    alert('Your browser cannot handle this script'); 
    } 
    try { 
    xmlDoc.async=false; 
    xmlDoc.load(fname); 
    return(xmlDoc); 
    } 
catch(e) 
{ 
    try //Google Chrome 
    { 
    var xmlhttp = new window.XMLHttpRequest(); 
    xmlhttp.open("GET",file,false); 
    xmlhttp.send(null); 
    xmlDoc = xmlhttp.responseXML.documentElement; 
    return(xmlDoc); 
    } 
    catch(e) 
    { 
    error=e.message; 
    } 
} 
} 

function displayResult() 
{ 
xml=loadXMLDoc("report.xml"); 
xsl=loadXMLDoc("report.xsl"); 
// code for IE 
if (window.ActiveXObject) 
    { 
    ex=xml.transformNode(xsl); 
    document.getElementById("example").innerHTML=ex; 
    } 
    // code for Mozilla, Firefox, Opera, etc. 
    else if (document.implementation 
    && document.implementation.createDocument) 
    { 
    xsltProcessor=new XSLTProcessor(); 
    xsltProcessor.importStylesheet(xsl); 
    resultDocument = xsltProcessor.transformToFragment(xml,document); 
    document.getElementById("example").appendChild(resultDocument); 
    } 
} 

Il fonctionne trouver pour IE et Firefox, mais le chrome est échouer dans la ligne:

document.getElementById("example").appendChild(resultDocument); 

Nous vous remercions de votre aide.

Répondre

5

Google Chrome bénéficie actuellement d'un support limité pour XSL. Si votre XSL se réfère à des ressources externes (fonction document(), xsl:import, xsl:include ou des entités externes), le XSL s'exécutera mais le résultat sera vide ou invalide.

Si ce n'est pas la cause de votre problème, le problème peut être différent: resultDocument et document ne partagent pas la même racine. Essayez d'utiliser importNode ou une technique similaire. Si cela échoue et que vous êtes certain que resultDocument a un contenu valide, transformez-le en chaîne, ajoutez un noeud manuellement et définissez innerHTML du nouveau noeud sur la chaîne. Je sais, c'est moche, mais jusqu'à ce que Chrome devienne mature nous aurons besoin de quelques solutions de contournement ...

+0

merci, j'ai lutté toute une matinée à la recherche de cette – Juan

3

J'ai trouvé que Chrome (pour les tags tr et td au moins), nécessite un format html bien formé. Par exemple, vous ne pouvez pas commencer à tr - cela doit être dans un tbody (ou thead), mais vous ne pouvez pas commencer là non plus, il doit être placé dans une étiquette de table ... (Je ne pense pas que le moteur xslt pardonne les règles de html - même si vous essayez de former un fragment.)

Donc si vous voulez une table d'un xslt - faire le tout, pas une partie. -À-dire: Faites ceci

<table><tbody><tr><td></td></tr></tbody></table> 

PAS CE:

<tbody><tr><td></td></tr></tbody> 

OU CE:

<tr><td></td></tr> 

Ou dans mon expérience, les balises tr se sont perdus et il ressemblait à beaucoup de texte .

Questions connexes