为什么XSLT在IE10中添加换行符(回车符)

时间:2013-08-06 18:19:13

标签: javascript xml internet-explorer 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>

1 个答案:

答案 0 :(得分:0)

我发现如果我使用“ActiveXObject(”Msxml2.XMLHTTP“)而不是”window.XMLHttpRequest“,问题就会消失。

似乎微软刚刚实现了浏览器原生的“window.XMLHttpRequest”......但它有bug和限制。

例如,“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())