заменить значение переменной XSL, используя js, если строка содержит одинарные кавычки - PullRequest
0 голосов
/ 17 мая 2019

У меня есть XSL, как показано ниже:

<xsl:template match="/">
    <xsl:variable name="vartext" select="''" />

....
             <th>
                <xsl:value-of select="$vartext"/>
              </th>

Я установил значение vartext с помощью js, как показано ниже:

node = this.xsldoc.selectSingleNode('//xsl:variable[...]']');
node.setAttribute('select', sometext);

Соответствие https://www.w3schools.com/xml/ref_xsl_el_variable.asp, Если атрибут select содержит буквенную строку, строка должна быть в кавычках.

Но переменная может содержать значение типа «Hey d'text».

Поэтому, когда я хочу преобразовать свой XML с использованием предоставленного XSL, он не работает. Я даже пытался заменить 'на \'.

Обновление

Я попробовал одиночную кавычку в функции concat xslt до публикации вопрос и мне это не помогло.

Я использую XSL, как показано ниже:

var res = xsltDo(this.xmldoc, this.xsldoc, this.html_element, iOptionParent);

xsltDo = function (xml, xsl, target, iOptionParent) {
        try {
            if (!iOptionParent) target.innerHTML = "";
            var fragment = xml.transformNode(xsl);
            target.innerHTML += fragment;
            //$( window ).trigger( "XsltDone", [target] );

            if (window.AC !== undefined) {
                window.AC.onDomChange(target);
            }

            return true;
        }
        // si erreur on retourne une XsltError
        catch (err) {
            return new Error(err);
        }
    };

1 Ответ

1 голос
/ 17 мая 2019

Это было слишком долго, чтобы писать в комментариях, но предполагалось, что для someText установлено просто "Эй". Если вы делаете именно это

 node.setAttribute('select', someText);

Тогда это то же самое, что сделать это непосредственно в XSLT

 <xsl:variable name="vartext" select="Hey" />

Это выберет элемент с именем «Эй», а не текстовый литерал «Эй»

Что вы можете сделать, это ...

 node.setAttribute('select', '"' + someText + '"');

Это будет эквивалентно выполнению этого в XSLT

 <xsl:variable name="vartext" select='"Hey"' />

Это также будет работать, если у вас есть апостроф в переменной someText, и вам не нужно экранировать его в javascript. Тем не менее, он потерпит неудачу, если у вас есть кавычка " в someText.

Что было бы проще, справиться и с апострофами, и с кавычками, это удалить атрибут select и добавить текст в качестве дочернего узла

node.removeAttribute("select");
node.appendChild(xsl.createTextNode(someText));

Это было бы то же самое, что делать это ...

<xsl:variable name="vartext">Hey 'Text "It works!"</xsl:variable>

Конечно, на самом деле вы должны изменить XSLT на использование параметров. Не в последнюю очередь потому, что «selectSingleNode» поддерживается только в Internet Explorer.

Если вы можете изменить XSLT для использования параметров, есть другие вопросы по StackOverflow, чтобы показать, что вы должны устанавливать параметры в Javascript. См. Как передать параметр в XSLT из функции Javascript, например, .

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