Chrome y Safari XSLT usando JavaScript
Tengo el siguiente código que aplica un estilo 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);
}
}
El código funciona en IE y Firefox pero no en Chrome y Safari. ¿Alguna idea de por qué?
Actualizar
ResultDocument = xsltProcessor.transformToFragment(xml, document);
La línea de arriba está volviendo nula. No se está lanzando ningún error.
Actualizar
El código no funciona, ya que el archivo xslt contiene xsl: include. Necesito encontrar una manera de hacer que la inclusión funcione. Pegaré el progreso aquí.
Actualizar
Se ha recomendado que use elhttp://plugins.jquery.com/project/Transform/ enchufar. Estoy tratando de usar la biblioteca del lado del cliente como ejemplo de incluir trabajos aquí (http://daersystems.com/jquery/transform/).
El código funciona en IE pero aún no en Chrome.
Test.Xml.xslTransform = function(xml, xsl) {
try {
$("body").append("<div id='test' style='display:none;'></div>");
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 y xsl son objetos que se pasan.
Actualizar
Intenté cambiar el archivo XSL para que fuera algo muy simple sin incluir y Chrome todavía no está aplicando la hoja de estilo y IE. El XSL que se presenta como un objeto es:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:spsoap="http://schemas.microsoft.com/sharepoint/soap/"
>
<xsl:output method="html"/>
<xsl:template match="/">
<h1>test</h1>
</xsl:template>
</xsl:stylesheet>
Actualizar
El resultado final que quiero es que el xsl se aplique al archivo xml. El archivo xsl tiene en él incluye. Quiero que la transferencia ocurra idealmente en el cliente.
Actualizado Rupert, ¿podría actualizar la pregunta con el xml y cómo está llamando a Test.Xml.xslTransform?
Tengo el xml usando ie8
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><SearchListItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/"><SearchListItemsResult><listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<rs:data ItemCount="1">
<z:row ows_Title="Test" ows_FirstName="Test 4" ows_UniqueId="74;#{1A16CF3E-524D-4DEF-BE36-68A964CC24DF}" ows_FSObjType="74;#0" ows_MetaInfo="74;#" ows_ID="74" ows_owshiddenversion="10" ows_Created="2009-12-29 12:21:01" ows_FileRef="74;#Lists/My List Name/74_.000" ReadOnly="False" VerificationRequired="0"/>
</rs:data>
</listitems></SearchListItemsResult></SearchListItemsResponse></soap:Body></soap:Envelope>
El código se llama de la siguiente manera:
xsl = Test.Xml.loadXMLDoc("/_layouts/xsl/xsl.xslt");
var doc = Test.Xml.xslTransform(xData.responseXML, xsl);
xData es el xml devuelto por un servicio web.