2010-08-24 7 views
0

J'essaie d'inclure un GoogleMap v3 (tout allait bien avec v2) dans mes pages HTML générées avec XLS Transformations. Mon code JS vient de this page. Fondamentalement, la carte fonctionne correctement lorsque tout est en HTML, comme dans l'exemple, mais quand j'essaie de l'inclure dans la feuille de style XSL, Firefox (v3.6) se plaint et ne veut rien charger:XSLT, Doctype et Google-Map v3 ne fonctionnent pas

Error: uncaught exception: [Exception... "Operation is not supported" code: "9" nsresult: "0x80530009 (NS_ERROR_DOM_NOT_SUPPORTED_ERR)" location: " http://maps.google.com/maps/api/js?sensor=false Line: 9"]

Error: google.maps.LatLng is not a constructor Source File: file:///home/kevin/google/data.xml Line: 2

Voici une version simplifiée du code XSL J'utilise:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE xsl:stylesheet > 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <html> 
     <head> 
     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
     <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
     <style type="text/css"> 
     html { height: 100% } 
     body { height: 100%; margin: 0px; padding: 0px } 
     #map_canvas { height: 100% } 
     </style> 
     <title>Google Maps JavaScript API v3 Example: Map Simple</title> 
     <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
     <script type="text/javascript"> 
     function initialize() { 
     var myLatlng = new google.maps.LatLng(-34.397, 150.644); 
     var myOptions = { 
     zoom: 8, 
     center: myLatlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     } 
     var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
     } 
     </script> 
     </head> 
     <body onload="initialize()"> 
     <div id="map_canvas"></div> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

et un document XML minimaliste pour déclencher la transformation:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE xsl:stylesheet> 
<?xml-stylesheet type="text/xsl" href="Display.xsl"?> 
<root /> 

Selon mes recherches Google, le problème peut provenir d'une mauvaise Doctype, mais je ne sais pas vraiment comment le résoudre, des fonctions telles que

<xsl:output method="html" 
    indent="yes" 
    omit-xml-declaration="yes" 
    encoding="utf-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" /> 

ne change rien.

EDIT: mon DOCTYPE réelle est un peu plus comple, pour XML:

<!DOCTYPE xsl:stylesheet [<!ENTITY auml "&#228;" ><!ENTITY ouml "&#246;" ><!ENTITY uuml "&#252;" ><!ENTITY szlig "&#223;" ><!ENTITY Auml "&#196;" ><!ENTITY Ouml "&#214;" ><!ENTITY Uuml "&#220;" ><!ENTITY euml "&#235;" ><!ENTITY ocirc "&#244;" ><!ENTITY nbsp "&#160;" ><!ENTITY Agrave "&#192;" ><!ENTITY Egrave "&#200;" ><!ENTITY Eacute "&#201;" ><!ENTITY Ecirc "&#202;" ><!ENTITY egrave "&#232;" ><!ENTITY eacute "&#233;" ><!ENTITY ecirc "&#234;" ><!ENTITY agrave "&#224;" ><!ENTITY iuml "&#239;" ><!ENTITY ugrave "&#249;" ><!ENTITY ucirc "&#251;" ><!ENTITY uuml "&#252;" ><!ENTITY ccedil "&#231;" ><!ENTITY AElig "&#198;" ><!ENTITY aelig "&#330;" ><!ENTITY OElig "&#338;" ><!ENTITY oelig "&#339;" ><!ENTITY euro "&#8364;"><!ENTITY laquo "&#171;" ><!ENTITY raquo "&#187;" >]> 

et XSL:

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY % xhtml-lat1 SYSTEM 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"> 
    <!ENTITY % xhtml-special SYSTEM 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"> 
    <!ENTITY % xhtml-symbol SYSTEM 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"> 
    %xhtml-lat1; 
    %xhtml-special; 
    %xhtml-symbol; 
    ]> 

à manipuler correctement tous mes accents et les caractères spéciaux, donc je pour éviter de s'en débarrasser, si possible

EDIT 2: le problème est en fait exactement la même chose avec je tente de charger un OpenStreetMap si Mapstraction API, document.write n'est pas autorisé.

Une autre chose que ce v2 Google Map fonctionne correctement lorsque j'utilise une fonction de rappel:

http://maps.google.com/maps?file=api&v=2.x&key={myKey}&c&async=2&callback={myInitFunct}

Toute idée de ce qui peut se tromper?

+0

(@Dimitre, qu'est-ce qui n'allait pas avec ma balise xslt?) – Kevin

+0

Ceci n'est pas une question XSLT. Cette question pose un problème qui ne concerne pas "Comment résoudre ce problème particulier en utilisant XSLT" mais la question est sur la façon de faire exécuter un environnement/xslt-processeur particulier. Pour récapituler - ce problème est spécifique à FF, donc il tombe sous la balise xsltprocessor. –

Répondre

2

la solution est d'utiliser le paramètre callback de l'API GoogleMap:

http://maps.google.com/maps/api/js?sensor=false&callback= {myInitFunction}

En effet, comme on peut le voir dans le script JS généré , ils n'insèrent pas leur code de la même manière:

Avec rappel:

function getScript(src) { 
    var s = document.createElement('script'); 

    s.src = src; 
    document.body.appendChild(s); 
    } 

Sans rappel:

function getScript(src) { 
document.write('<' + 'script src="' + src + '"' + 
       ' type="text/javascript"><' + '/script>'); 
} 

document.write pourrait être interdite ...

(cependant, je ne comprends pas vraiment pourquoi ils utilisent deux codes différents pour la même action, peut-être juste pour résoudre notre problème :)

grâce à this blog pour le tutoriel

0

La bonne façon de déclarer stylesheet DOCTYPE:

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY % HTMLlat1 PUBLIC 
     "-//W3C//ENTITIES Latin 1 for XHTML//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"> 
    %HTMLlat1; 
    <!ENTITY % HTMLspecial PUBLIC 
     "-//W3C//ENTITIES Special for XHTML//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"> 
    %HTMLspecial; 
    <!ENTITY % HTMLsymbol PUBLIC 
     "-//W3C//ENTITIES Symbols for XHTML//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"> 
    %HTMLsymbol; 
]> 
+0

@Alejandro, est 1) mon code ne fonctionne pas et 2) votre code de travail pour vous? parce que j'ai la même erreur quand j'essaye votre exemple (et pour XSLT v2, je ne sais pas où j'ai eu ce numéro, je le changerai en v1, où il appartient!) – Kevin

0

La question voici que la sortie XSLT dans FF ne se comporte pas comme du HTML statique.

Dans une page HTML statique, le script GMap est chargé de manière synchrone, de sorte que lorsque l'événement body.onload se déclenche, le script est déjà chargé.

Dans la sortie XSLT, le script est toujours en cours de chargement lorsque body.onload se déclenche.

J'ai travaillé autour de la question de cette façon (ce qui suit est la sortie XSLT):

<html> 
<head> 
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;callback=onLoadCode"></script> 
    <script type="text/javascript"> 
     function onLoadMaps() 
     { 
      /// init the maps here 
     } 

     var zOnLoadCode = false; 
     var zOnLoadBody = false; 
     function onLoadCode() { zOnLoadCode = true; } 
     function onLoadBody() { zOnLoadBody = true; } 
     var onLoadTimer = window.setInterval(function() { 
      if(zOnLoadCode && zOnLoadBody) { 
       window.clearInterval(onLoadTimer); 
       onLoadMaps(); 
      } 
     },100,"javascript"); 
    </script> 
</head> 
<body onload="onLoadBody();"> 
    <!-- put your maps here --> 
</body> 

C'est, j'utilisé l'URL de rappel GMap param pour signaler lorsque le script est chargé et la body.onload événement pour signaler quand la page est prête, alors j'attends que les deux aient été virés.

+0

merci pour votre réponse, mais dans mon cas, le rappel est suffisant pour contourner le problème, pas besoin de vérifier si tout le reste est déjà chargé! – Kevin