Как выполнить XSLT-преобразование в Chrome с использованием переменных - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь сделать XSL-преобразование.

Однако всякий раз, когда ссылаются на переменную с фрагментом документа, преобразование кажется неудачным.

Я создал JSFiddle , чтобы продемонстрировать проблему.XML в этом примере является фиктивным документом, позволяющим запустить XSLT.

Что я делаю не так?

Javascript:

var xml = [
    '<p xmlns="http://www.w3.org/1999/xhtml">',
    '<\/p>'
    ].join('\n');

var xsl = [
    '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">',
    '<xsl:variable name="xmlVar">',
    '<aaaa value="It works"\/>',
    '<\/xsl:variable>',
    '<xsl:template match="\/">',
    '<ROOT>',
    //works ok after commenting out
    '<xsl:value-of select="$xmlVar\/aaaa\/@value"\/>',
    '<\/ROOT>',
    '<\/xsl:template>',
    '<\/xsl:stylesheet>'
    ].join('\n');



var domParser = new DOMParser();

var xmlDoc = domParser.parseFromString(xml, 'application/xml');

var xslDoc = domParser.parseFromString(xsl, 'application/xml');

var xsltProc = new XSLTProcessor();
xsltProc.importStylesheet(xslDoc);
try{
var result = xsltProc.transformToFragment(xmlDoc, document);
} catch(exc) {
document.getElementById('error').innerHTML = exc;
}

function encodeStr(rawStr) { return rawStr.replace(/[\u00A0-\u9999<>\&]/gim,   
    function(i){
    return '&#'+i.charCodeAt(0)+';'
  });
}

document.getElementById('xslText').innerHTML = encodeStr(xsl);
document.getElementById('result').innerHTML = encodeStr((new XMLSerializer).serializeToString(result));

HTML:

<code><pre id='xslText'>

1 Ответ

0 голосов
/ 17 ноября 2018

В XSLT 1.0 необходимо использовать функцию расширения, например exsl:node-set (http://exslt.org/exsl/functions/node-set/index.html), для преобразования значения переменной фрагмента результирующего дерева типов (https://www.w3.org/TR/xslt-10/#section-Result-Tree-Fragments) в набор узлов, чтобы иметь возможностьиспользуйте XPath на узлах, например

var xml = [
    '<p xmlns="http://www.w3.org/1999/xhtml">',
    '<\/p>'
    ].join('\n');

var xsl = [
    '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:exsl="http://exslt.org/common" xmlns:msxml="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="exsl msxml">',
    '<xsl:variable name="xmlVar">',
    '<aaaa value="It works"/>',
    '<\/xsl:variable>',
    '<xsl:template match="/">',
    '<div>',
    '<xsl:choose><xsl:when test="function-available(\'exsl:node-set\')"><xsl:value-of select="exsl:node-set($xmlVar)/aaaa/@value"/><\/xsl:when><xsl:when test="function-available(\'msxml:node-set\')"><xsl:value-of select="msxml:node-set($xmlVar)/aaaa/@value"/><\/xsl:when><\/xsl:choose>',
    '<\/div>',
    '<\/xsl:template>',
    '<\/xsl:stylesheet>'
    ].join('\n');



var domParser = new DOMParser();

var xmlDoc = domParser.parseFromString(xml, 'application/xml');

var xslDoc = domParser.parseFromString(xsl, 'application/xml');

var xsltProc = new XSLTProcessor();
xsltProc.importStylesheet(xslDoc);
try{
var result = xsltProc.transformToFragment(xmlDoc, document);
document.getElementById('result').appendChild(result);
} catch(exc) {
document.getElementById('error').innerHTML = exc;
}


Недостатком кросс-браузерной совместимости с XSLT 1 на стороне клиента является то, что Microsoft использует MSXML 3 или 6 в IE и Edge для обеспечения поддержки XSLT, и, к сожалению, MSXML имеет собственное собственное пространство имен для такой функции расширения вместо поддержки EXSLT..

Fiddle обновлен до http://jsfiddle.net/29pwf84c/14/.

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