Chrome и Safari XSLT использование JavaScript

У меня есть следующий код, который применяет стиль XSLT

Test.Xml.xslTransform = function(xml, xsl) {
    try {
        // code for IE
        if (window.ActiveXObject) {
            ex = xml.transformNode(xsl);
            return ex;
        }
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation && document.implementation.createDocument) {
            xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);
            resultDocument = xsltProcessor.transformToFragment(xml, document);
            return resultDocument;
        }
    } catch (exception) {
        if (typeof (exception) == "object") {
            if (exception.message) {
                alert(exception.message);
            }
        } else {
            alert(exception);
        }
    }

Код работает в IE и Firefox, но не в Chrome и Safari. Какие-либо идеи, почему?

Обновление

ResultDocument = xsltProcessor.transformToFragment(xml, document);

Строка выше возвращает пустой указатель. Никакая ошибка не бросается.

Обновление

Код не работает, поскольку xslt файл содержит xsl:include. Должен найти способ получить включать работу, я вставлю прогресс здесь

Обновление

Было рекомендовано, чтобы я использовал плагин http://plugins.jquery.com/project/Transform/. Я пытаюсь использовать сторону клиента libary, поскольку пример включает работы здесь (http://daersystems.com/jquery/transform/).

Код работает в IE, но все еще в хроме.

Test.Xml.xslTransform = function(xml, xsl) {
        try {
                $("body").append("");
                var a = $("#test").transform({ xmlobj: xml, xslobj: xsl });
                return a.html();
        }
        catch (exception) {
            if (typeof (exception) == "object") {
                if (exception.message) {
                    alert(exception.message);
                }
            } else {
                alert(exception);
            }

        }
    }

xml и xsl являются оба объектами, передаваемыми в.

Обновление

Я пытался измениться, файл XSL к тому, чтобы быть чем-то очень простым без включают, и Chrome все еще не применяет таблицу стилей, и IE. XSL, который вводится как объект:



    
    
        

test

Обновление

Конечный результат, который я хочу, состоит в том, чтобы xsl был применен к XML-файлу. xsl файл имеет в нем, включает. Я хочу, чтобы передача произошла на клиенте идеально.

Обновленный Rupert мог Вы обновлять вопрос с xml и как Вы называете Тест. Xml.xslTransform?

Я получил xml, использующий ie8



                    
                        
                    
                

Код называют следующим образом:

xsl = Test.Xml.loadXMLDoc("/_layouts/xsl/xsl.xslt");
var doc = Test.Xml.xslTransform(xData.responseXML, xsl);

xData является xml, возвращенным веб-сервисом.

11
задан Rupert 20 January 2010 в 14:50
поделиться

1 ответ

Если ваш XSLT использует XSL: включить , вы можете получить странные необъяснимые ошибки, но всегда с тем же конечным результатом: ваша преобразование.

См. Этот отчет об ошибках хрома и, пожалуйста, поддержите его! http://code.google.com/p/chromium/issues/detail?id=8441

Ошибка на самом деле в WebKit, хотя. Для получения дополнительной информации Вот другая ссылка, которая входит в более подробно, почему она не работает.

Единственный способ вокруг этого предназначен для предварительной обработки таблицы стилей, чтобы он вводил включенные таблицы стилей. Какая библиотека XSLT CrossBrowser, как SARISSA, будет делать для вас автоматически.

Если ваш поиск решения jQuery:
http://plugins.jquery.com/project/transform/ - это плагин Crosser Browser XSL. Я успешно использовал это, чтобы получить XSL: включить , работаю в прошлом без особых хлопот. Вам не нужно переписать ваш этот плагин XSL, предварительно обработает их для вас. Определенно стоит смотреть на то, что он более легкий, чем Сарисса.

Обновление:

<html>
<head>
<script language="javascript" src="jquery-1.3.2.min.js"></script> 
<script language="javascript" src="jquery.transform.js"></script>  
<script type="text/javascript">
function loadXML(file)
{
    var xmlDoc = null;
    try //Internet Explorer
    {
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async=false;
        xmlDoc.load(file);
    }
    catch(e)
    {
        try //Firefox, Mozilla, Opera, etc.
        {
            xmlDoc=document.implementation.createDocument("","",null);
            xmlDoc.async=false;
            xmlDoc.load(file);
        }
        catch(e)
        {
            try //Google Chrome
            {
                var xmlhttp = new window.XMLHttpRequest();
                xmlhttp.open("GET",file,false);
                xmlhttp.send(null);
                xmlDoc = xmlhttp.responseXML.documentElement;
            }
            catch(e)
            {
            error=e.message;
            }
        }
    }
    return xmlDoc;
}
function xslTransform(xmlObject, xslObject)
{
    try 
    {
        $("body").append("<div id='test'></div>");
        var a = $("#test").transform({ xmlobj: xmlObject, xslobj: xslObject });
    }
    catch (exception) 
    {
        if (typeof (exception) == "object" && exception.message) 
            alert(exception.message);
        else alert(exception);
    }
}
var xmlObject = loadXML("input.xml");
var xslObject = loadXML("transform.xsl");
$(document).ready(function()  
{
    xslTransform(xmlObject, xslObject);
});
</script>
</head>
<body>

</body>
</html>

Эта тестовая страница HTML работает как в Chrome / Firefox / IE.

Вход .xml - просто простой XML-файл, содержащий Transform.xsl - это выделенный вниз XSL.

Отредактируйте

Это, однако, кажется, имеет значение $ .Transform имеет проблемы, импортирующие таблицы стилей из включенных файлов:

Вот как это исправить:

Найти

var safariimportincludefix = function(xObj,rootConfig) {

в jQuery.transform.js И замените всю функцию с этим:

var safariimportincludefix = function(xObj,rootConfig) {
    var vals = $.merge($.makeArray(xObj.getElementsByTagName("import")),$.makeArray(xObj.getElementsByTagName("include")));

    for(var x=0;x<vals.length;x++) {
        var node = vals[x];
        $.ajax({
            passData : { node : node, xObj : xObj, rootConfig : rootConfig},
            dataType : "xml",
            async : false,
            url : replaceref(node.getAttribute("href"),rootConfig),
            success : function(xhr) {
                try {
                    var _ = this.passData;
                    xhr = safariimportincludefix(xhr,_.rootConfig);

                    var imports = $.merge(childNodes(xhr.getElementsByTagName("stylesheet")[0],"param"),childNodes(xhr.getElementsByTagName("stylesheet")[0],"template"));
                    var excistingNodes = [];
                    try 
                    {
                        var sheet = _.xObj;
                        var params = childNodes(sheet,"param");
                        var stylesheets = childNodes(sheet,"template");
                        existingNodes = $.merge(params,stylesheets);
                    }
                    catch(exception) 
                    {
                        var x = exception;
                    }
                    var existingNames = [];
                    var existingMatches = [];
                    for(var a=0;a<existingNodes.length;a++) {
                        if(existingNodes[a].getAttribute("name")) {
                            existingNames[existingNodes[a].getAttribute("name")] = true;
                        } else {
                            existingMatches[existingNodes[a].getAttribute("match")] = true;
                        }
                    }

                    var pn = _.node.parentNode;
                    for(var y=0;y<imports.length;y++) {
                        if(!existingNames[imports[y].getAttribute("name")] && !existingMatches[imports[y].getAttribute("match")]) {
                            var clonednode = _.xObj.ownerDocument.importNode(imports[y],true);
                            //pn.insertBefore(clonednode,_.xObj);
                            pn.insertBefore(clonednode,childNodes(_.xObj,"template")[0]);
                        }
                    }
                    pn.removeChild(_.node);
                } catch(ex) { 

                }
            }
        });
    }

    return xObj;
};

Теперь используя ранее наклеиваемый тестовый index.html Используйте это для Transform.xsl :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    >
        <xsl:include href="include.xsl" />
    <xsl:output method="html"/>
    <xsl:template match="/">
            <xsl:call-template name="giveMeAnIncludedHeader" />
    </xsl:template>
</xsl:stylesheet>

и это для включают в себя .xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="giveMeAnIncludedHeader">
        <h1>Test</h1>
    </xsl:template>
</xsl:stylesheet>

Ранее опубликованное Исправление в jQuery.transform.js Теперь вставят вставку включенного

Test на всех браузерах.

Вы можете увидеть его в действии здесь: http://www.mpdreamz.nl/xsltest

14
ответ дан 3 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: