2011-09-19 39 views
-2

這裏有些東西很棘手。我試圖解析這個XSL文件:XSL樣式表不會解析 - 爲什麼?

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 
<xsl:template match="/"> 


<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<title>Events</title> 
</head> 

<body> 

    <dl> 

    <xsl:for-each select="all/event"> 
     <xsl:sort select="substring(@displayuntil,7,4)" data-type="number" /> <!-- year --> 
     <xsl:sort select="substring(@displayuntil,1,2)" data-type="number" /> <!-- month --> 
     <xsl:sort select="substring(@displayuntil,4,2)" data-type="number" /> <!-- day --> 

     <dt> 
      <xsl:value-of select="@displayuntil" /> 
      -- 
      <xsl:value-of select="@title" /> 
     </dt> 
     <dd> 
      <xsl:value-of select="description" disable-output-escaping="yes" /> 
     </dd> 

    </xsl:for-each> 
    </dl> 


</body> 
</html> 


</xsl:template> 
</xsl:stylesheet> 

使用下面的JavaScript代碼,從W3Schools的考慮:

function loadXMLDoc(dname) { 
    if (window.XMLHttpRequest) { 
     var xhttp = new XMLHttpRequest(); 
    } else { 
     var xhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xhttp.open("GET",dname,false); 
    xhttp.send(); 
alert(xhttp.responseText); // displays the contents of the document 
alert(xhttp.responseXML.xml); // in IE, displays nothing 
    return xhttp.responseXML; 
} 

xhttp.responseText警報顯示我的文檔,所以我知道它的加載。 xhttp.responseXML.xml警報是空白的,所以顯然它不是一個格式良好的XML文件。

我已經運行它通過http://XMLvalidation.com並沒有得到任何錯誤。那麼我忽略了什麼?

+0

它適合我。我只是將該JavaScript代碼附加到按鈕單擊,並將xsl放入服務器上的文件。當我點擊按鈕時,我收到了兩條警報,兩條警報的內容基本相同。 – Cheeso

+0

@Cheeso - 好:這表明我的XSL是正確的。不好:我不知道問題的其他地方在哪裏...... – Blazemonger

回答

1

它適用於我。

我只是將該JavaScript代碼附加到按鈕單擊,並將xsl放入服務器上的文件。當我點擊按鈕時,我收到了兩條警報,兩條警報的內容基本相同。

這可能是你正在運行到一個陳舊的緩存。我昨天就遇到了這個。我使用XHR來檢索一個XML文件,並且我得到一箇舊的副本。如果您一直在更改xsl,可能是網頁檢索到的文檔是舊版本,也可能是無效的。爲了避免這種情況,請將URL追加?_<random number>

另外,你應該在函數中聲明你的var一次。在Javascript中,變量具有函數範圍,因此無論您在何處放置var聲明,變量名稱在整個函數中都是已知的。這意味着將所有增值變量放在函數頂部是一種很好的編碼風格,無論您使用的是哪個變量。事實上,在if子句和else子句中聲明一個具有相同名稱的var是衝突的;我不知道JS引擎會對此做什麼,但嚴格來說這是不明智的。雖然容易改變。

編輯 - 最後,您應該使用更新的ProgId。有關說明,請參見this blog post from Microsoft。其實你不需要解釋,小故事是,Microsoft.XMLHTTP是錯的。你應該使用的是MSXML2.XMLHTTP

這些變化我的代碼看起來是這樣的:

function loadXMLDoc(dname) { 
    var xhr = null, 
     d = new Date(), 
     noCacheUrl = dname + "?_=" + d.valueOf(); 

    // if the original document is mblase.xsl, then the "no cache" url will be 
    // sth like mblase.xsl?_399383932 , where the number varies for each request. 
    // The 'query string' will be discarded and you will get the same static file. 
    // This insures that you always get a fresh copy of the xsl document. 
    if (window.XMLHttpRequest) { 
     xhr = new XMLHttpRequest(); 
    } else { 
     xhr = new ActiveXObject("MSXML2.XMLHTTP"); // current, correct ProgId 
    } 
    xhr.open("GET",noCacheUrl,false); 
    xhr.send(); 
    alert(xhr.responseText); // displays the contents of the document 
    alert(xhr.responseXML.xml); // displays an indented version of the XSL document 
    return xhr.responseXML; 
} 

如果無緩存招不工作,那麼你需要進一步診斷。如果我試圖診斷這一點,我會簡化XSL文件 - 使其僅僅是一個XML文件,非常簡單,並且看看你是否可以得到這個工作。然後逐漸加回複雜度。這將允許您避免或排除無效/格式錯誤的XML問題。

+0

我已經嘗試將我的XSL剝離爲:'<?xml version =「1.0」encoding =「utf-8」?>' - - 沒提升。 – Blazemonger

+0

檢查我的最新編輯 - 你應該使用更新的ProgId。 – Cheeso

+0

將我的text.xsl文件更改爲test.xml而沒有其他更改(並適當修改我的JavaScript)解決了所有問題。顯然,我公司的服務器沒有發送帶有正確頭文件的* .xsl文件。爲了讓我擺脫錯誤的軌道,我正在授予你答案。 – Blazemonger