Таблица стилей XSL не будет анализироваться - почему? - PullRequest
0 голосов
/ 19 сентября 2011

Здесь что-то не так.Я пытаюсь проанализировать этот 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 и не получаю ошибок.Так что я упустил из виду?

1 Ответ

1 голос
/ 19 сентября 2011

Это работает для меня.

Я просто прикрепил этот код JavaScript к нажатию кнопки и поместил xsl в файл на сервере.Когда я нажал кнопку, я получил два оповещения, оба с одинаковым содержанием.

Возможно, вы работаете в устаревшем кеше.Я столкнулся с этим только вчера.Я использовал XHR для извлечения XML-файла и получал старую копию.Если вы меняли xsl, это может быть документ, который веб-страница получает, это старая версия, которая также может быть недействительной.Чтобы избежать этого, добавьте ?_<random number> к URL.

Также вы должны объявлять вашу переменную не более одного раза в функции.В Javascript переменные имеют область действия функции, поэтому независимо от того, где вы поместили объявление var, это имя переменной известно во всей функции.Это означает, что это хороший стиль кодирования, чтобы поместить все переменные в верхнюю часть функции, независимо от того, где вы их используете.Фактически, это конфликт с объявлением переменной с таким же именем в предложении if, а также в предложении else;Я не знаю, что с этим сделает движок JS, но, строго говоря, не имеет смысла.Легко изменить хотя.

РЕДАКТИРОВАТЬ - Наконец, вы должны использовать обновленный ProgId.См. это сообщение в блоге от 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...