2010-08-24 47 views
0

我想在我的HTML頁面中使用XLS Transformations生成一個GoogleMap v3(一切正常,v2)。我的JS代碼來自this pageXSLT,Doctype和Google-Map v3不能正常工作

基本上,當所有東西都是純HTML格式時,該映射正常工作,但是當我嘗試將它包含在XSL樣式表中時,Firefox(v3.6)抱怨並且不想加載任何東西:

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

下面是一個簡化版本,我使用的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 /> 

根據我的谷歌的調查,問題可能來自一個錯誤的文檔類型,但我真的不知道如何解決它,功能類似於

<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稍微COMPLE,對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:問題實際上是與我嘗試通過Mapstraction API加載OpenStreetMap完全一樣,不允許使用document.write

的另一件事情是,谷歌地圖V2正常工作,當我使用一個回調函數:

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

什麼可以是錯誤的任何線索?

+0

(@Dimitre,我的xslt標記有什麼問題?) – Kevin 2010-08-24 12:52:38

+0

這不是一個XSLT問題。這個問題提出的問題不是關於「如何使用XSLT解決這個特定問題」,而是關於如何使特定環境/ xslt處理器執行的問題。總結 - 這個問題是FF特有的,所以它屬於xsltprocessor標籤。 – 2010-08-24 13:10:28

回答

2

的解決方案是使用callback參數的GoogleMap的API的:

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

事實上,我們可以在生成的JS腳本見,他們不以相同的方式插入他們的代碼:

With callback:

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可能會被禁止?

(但是,我真的不明白爲什麼他們使用兩種不同的代碼相同的動作,也許只是爲了解決我們的問題:)

感謝this blog本教程

0

聲明樣式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,是1)我的代碼不工作,2)你的代碼爲你工作?因爲我在嘗試你的例子時遇到了同樣的錯誤(對於XSLT v2,不知道我在哪裏得到這個數字,我會將它更改回v1,它屬於它!) – Kevin 2010-08-24 13:03:06

0

問題這裏是FF中的XSLT輸出不像靜態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> 

也就是說,我用GMAP回調URL參數是加載腳本時,信號和當頁面準備就緒時,body.onload事件發出信號,然後等到兩者都被觸發。

+0

謝謝你anwser,但在我的情況下,回調足以繞過問題,無需檢查是否其他所有內容已經加載! – Kevin 2010-10-21 08:18:05