XSLT, Doctype и Google-Map v3 не работают - PullRequest
0 голосов
/ 24 августа 2010

Я пытаюсь включить GoogleMap v3 (все было в порядке с v2) в мои HTML-страницы, созданные с помощью XLS Transformations.Мой JS-код получен с этой страницы .

По сути, карта работает правильно, когда все в простом HTML, как показано в примере, однако, когда я пытаюсь включить его в таблицу стилей XSL,Firefox (v3.6) жалуется и не хочет ничего загружать:

Ошибка: необработанное исключение: [Исключение ... "Операция не поддерживается" код: "9" nsresult: "0x80530009(NS_ERROR_DOM_NOT_SUPPORTED_ERR) "location:" http://maps.google.com/maps/api/js?sensor=false Строка: 9 "]

Ошибка: google.maps.LatLng не является конструктором Исходный файл: file: /// home / kevin / google / data.xml Строка: 2

Вот упрощенная версия кода XSL, который я использую:

<?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>

и минималистский XML-документ для запуска преобразования:

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

Согласно моим исследованиям в Google, проблема может быть в неправильном Doctype, но я не знаю, как его исправить, такие функции, как

<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" />

ничего не меняют.

РЕДАКТИРОВАТЬ : мой фактический DOCTYPE немного более полон, для 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;" >]>

и 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;
  ]>

, чтобы правильно обрабатывать все мои акценты и специальные символы, поэтому я хотел бы избежать, если это возможно, избавления от него

РЕДАКТИРОВАТЬ 2 : проблема на самом деле точно такая же, с которой я пытаюсь загрузить OpenStreetMap, хотя Mapstraction API, document.write не допускается.

Другое дело, что Google Map v2 работаетправильно, когда я использую функцию обратного вызова:

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

Любая подсказка о том, что может быть не так?

Ответы [ 3 ]

2 голосов
/ 28 августа 2010

решение состоит в том, чтобы использовать параметр callback API GoogleMap:

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

Действительно, как мы можем видеть в сгенерированном сценарии JSони не вводят свой код одинаково:

с обратным вызовом:

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

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

без обратного вызова:

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

где document.write может быть запрещено ...

(однако, я не совсем понимаю, почему они используют два разных кода для одного и того же действия, может быть, просто для решения нашей проблемы:)

спасибо этому блогу за урок

0 голосов
/ 21 октября 2010

Проблема здесь в том, что вывод XSLT в FF не ведет себя как статический HTML.

На статической HTML-странице скрипт GMap загружается синхронно, поэтому при возникновении события body.onload сценарий уже загружен.

В выводе XSLT сценарий все еще загружается при запуске body.onload.

Я обошел проблему следующим образом (далее вывод 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>

То есть я использовал параметр URL обратного вызова GMap, чтобы сигнализировать, когда скрипт загружен, и событие body.onload, чтобы сигнализировать, когда страница готова, затем я жду, пока оба не будут запущены.

0 голосов
/ 24 августа 2010

Правильный способ объявления таблицы стилей 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;
]>
...