2013-08-06 53 views
1

就我所知,這只是以IE10開始的。爲什麼XSLT在IE10中添加換行符(回車)

這不是FF中的問題。

使用XMLHttpRequest來得到一些XML數據,然後使用XSLT顯示它...

XSLT轉換是自動看似隨機位置增加新的生產線,其中有在要素數據的空間。

如果我使用getElementsByTagName預覽數據,數據是完整的,沒有空間轉換爲換行符。

由於html將新行視爲空格,因此如果僅顯示文本或將其放置在輸入框中,則看不到問題,但是,如果數據存儲在隱藏元素中,並且使用警報函數可以看到輸出數據中有換行符/回車符。

如果在原始XML數據中的元素之後沒有回車符,則問題似乎更糟。在某些情況下,我實際上可以通過在每個元素之後添加回車來解決此問題。有些情況下,並非全部。

這幾乎就好像變壓器試圖讀取數據時爲了便於閱讀而在空間處分割數據一樣,它會自動添加回車符。

實施例:

xsltTest.htm

<!DOCTYPE html> 
<html> 
<head> 
    <title>xslt test</title> 
    <script type="text/javascript" language="javascript"> 

     function loadFile(f) { 
      xhttp = new window.XMLHttpRequest 
      xhttp.open("GET", f, false) 
      xhttp.setRequestHeader("Cache-Control", "no-cache"); 
      xhttp.setRequestHeader("pragma", "no-cache"); 
      xhttp.send("") 

      //in IE10 this seems to show where the new lines get added 
      alert(xhttp.responseText) 

      var xml = xhttp.responseXML 

      displayData(xml, 'xsltTest.xslt', 'DataDiv') 

     } 

     function displayData(xmlResp, xslFile, targetObj) { 

      var xml = new ActiveXObject("MSXML2.DomDocument"); 
      xml.async = false; 
      xml.load(xmlResp); 

      var xsl = new ActiveXObject("MSXML2.FreeThreadedDomDocument"); 
      xsl.async = false; 
      xsl.load(xslFile); 

      xsl_template = new ActiveXObject("Msxml2.XSLTemplate") 
      xsl_template.stylesheet = xsl; 

      xslProc = xsl_template.createProcessor() 
      xslProc.input = xml 

      xslProc.transform() 
      document.getElementById(targetObj).innerHTML = xslProc.output 
     } 

     function popData(idx,e) { 
      alert(document.getElementById('data_'+idx+'_'+e).value) 
     } 

    </script> 
</head> 
<body> 
<center> 
<input type="button" id="WithCRButton" value="Load File WITH CarriageReturns" onclick="loadFile('DataWithCR.xml')" /> 
<input type="button" id="WithoutCRButton" value="Load File WITHOUT CarriageReturns" onclick="loadFile('DataWithoutCR.xml')" /> 
<div style="border:1px solid black;width:100%" id="DataDiv"> 
</div> 
</center> 
</body> 
</html> 

xsltTest.xslt

<?xml version="1.0" encoding="iso-8859-1"?> 

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 


    <xsl:template match="/"> 
     <table> 
      <xsl:for-each select="TestData/field"> 
       <tr> 
        <td> 
         <xsl:value-of select="elementData1"/> 
        </td> 
        <td> 
         <input type="hidden"> 
          <xsl:attribute name="value"><xsl:value-of select="elementData1"/></xsl:attribute> 
          <xsl:attribute name="id">data_<xsl:value-of select="position()"/>_1</xsl:attribute> 
         </input> 
         <input type="button" value="show hidden value"> 
          <xsl:attribute name="onclick">popData('<xsl:value-of select="position()"/>','1')</xsl:attribute> 
         </input> 
        </td> 
        <td> 
         <xsl:value-of select="elementData2"/> 
        </td> 
        <td> 
         <input type="hidden"> 
          <xsl:attribute name="value"><xsl:value-of select="elementData2"/></xsl:attribute> 
          <xsl:attribute name="id">data_<xsl:value-of select="position()"/>_2</xsl:attribute> 
         </input> 
         <input type="button" value="show hidden value"> 
          <xsl:attribute name="onclick">popData('<xsl:value-of select="position()"/>','2')</xsl:attribute> 
         </input> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 

</xsl:stylesheet> 

DataWithCR.xml

<TestData> 
<field> 
<elementData1>ThisHasNoSpaces</elementData1> 
<elementData2>ThisHasA Space</elementData2> 
</field> 
<field> 
<elementData1>ThisHasNoSpaces</elementData1> 
<elementData2>ThisHasA Space</elementData2> 
</field> 
<field> 
<elementData1>ThisHasNoSpaces</elementData1> 
<elementData2>ThisHasA Space</elementData2> 
</field> 
<field> 
<elementData1>ThisHasNoSpaces</elementData1> 
<elementData2>ThisHasA Space</elementData2> 
</field> 
</TestData> 

DataWithoutCR.xml

<TestData><field><elementData1>ThisHasNoSpaces</elementData1><elementData2>ThisHasA Space</elementData2></field><field><elementData1>ThisHasNoSpaces</elementData1><elementData2>ThisHasA Space</elementData2></field><field><elementData1>ThisHasNoSpaces</elementData1><elementData2>ThisHasA Space</elementData2></field><field><elementData1>ThisHasNoSpaces</elementData1><elementData2>ThisHasA Space</elementData2></field></TestData> 
+0

它是否有助於增加'的在樣式表前的''的'? – FrankPl

+0

你可以把什麼輸出實際上,它應該是什麼? – 2013-08-07 05:23:58

+0

輸出很難包含,但會發生的是,當警報框顯示數據「ThisHasA空間」時,「A」和「空間」之間的回車不在原始數據中。 – EddieB

回答

0

我發現,如果我用 「的ActiveXObject(」 MSXML2.XMLHTTP 「)」 而不是 「window.XMLHttpRequest」 的問題消失。

看來,微軟剛剛實現了瀏覽器本機「window.XMLHttpRequest」......但它有缺陷和侷限性。

例如,「ActiveXObject(」Msxml2.XMLHTTP「)」具有transformNode方法,但「window.XMLHttpRequest」沒有。

對於我的javascript代碼瀏覽器的兼容性我創建的對象,如下所示:

var XMLDoc = (window.XMLHttpRequest) ? (new XMLHttpRequest()) : (new ActiveXObject("Microsoft.XMLHTTP")) 

...所以在IE瀏覽器,只要window.XMLHttpRequest沒有它是使用ActiveXObject的存在。但現在它確實存在,它正在使用它,以及它的所有缺陷和限制。

我現在正在將該條件語句的每個位置都調用爲默認ActiveXObject(如果可用)

var XMLDoc = (window.ActiveXObject) ? (new ActiveXObject("Msxml2.XMLHTTP")) : (new XMLHttpRequest()) 
+0

沒有'transform'方法並不是一個限制,這個方法甚至在[spec](http://www.w3.org/TR/XMLHttpRequest/)中都沒有開始。 Microsoft根據該規範實施了「XMLHttpRequest」API。這是爲什麼XSLT要在服務器上運行的原因之一。不要做客戶端XSLT。 – Tomalak

+0

肯定有客戶方優先的情況。例如,當下載大量數據時,您只需要爲用戶調整或重新排列數據。所以,即使我們忘記了transformNode,只是堅持將最初的回車函數引入到數據中。這是完全不能接受的。又一個MS/IE錯誤。再次Scroood。 – EddieB

+0

我已經廣泛使用MSXML(後臺庫),我從來沒有在代碼中插入空白節點(這就是換行符)**除非**' '已設置或已經存在於輸入中。我很確定這個錯誤是在你的最後,或者是由於錯誤的實現或錯誤的期望。無論如何,我會用上面給出的示例代碼設置一個測試用例,並告訴你我的發現。 – Tomalak

相關問題