【问题标题】:replace value of XSL variable using js when the string contains single quote当字符串包含单引号时,使用js替换XSL变量的值
【发布时间】:2019-05-17 10:55:01
【问题描述】:

我有一个如下的 XSL:

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

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

我用js设置vartext的值,如下:

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

根据https://www.w3schools.com/xml/ref_xsl_el_variable.asp,如果选择属性包含文字字符串,则该字符串必须在引号内。

但变量可能包含像“'Hey d'text '”这样的值。

所以当我想使用提供的 XSL 转换我的 XML 时,它不起作用。我什至尝试将 ' 替换为 \'。

更新

我试过scape single quote in xslt concat function 在发布问题之前,它对我没有帮助。

我使用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);
        }
    };

【问题讨论】:

  • 如果您使用的是node.setAttribute,那么您不必担心转义,因为这仅适用于在解析和处理之前的初始 XSLT 文件。我认为您可能需要更多地解释您正在使用的过程(例如,您如何阅读和应用 XSLT),并准确解释“它不起作用”的意思。谢谢!
  • 从您显示的片段中,也许您实际上应该使用参数 (xsl:param) 而不是尝试以这种方式操作 XSLT。
  • @R3tep 我没有连接字符串,所以该解决方案对我不起作用。
  • 我想知道您真正想要达到的目标是什么?真的有必要通过修改源样式表来做到这一点吗?不能通过为xsl:param 参数提供值来完成吗?请记住,除非您非常小心,否则修改源代码总是会带来注入攻击的风险。
  • @BabakFakhriloo 参数化 XSLT 转换的正确机制是按照 Kay 博士的建议使用 xsl:param 声明。虽然不标准,但在 Javascript 中有一个很好的跨浏览器界面XSLTProcessor

标签: javascript xml xslt


【解决方案1】:

在 cmets 中写这有点太长了,但假设您将 someText 设置为“嘿”。如果你只是这样做

 node.setAttribute('select', someText);

那么这与直接在 XSLT 中这样做是一样的

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

这将选择一个名为“Hey”的元素,而不是文本文字“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 中设置参数。例如,请参阅How to pass parameter to XSLT from Javascript function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2017-06-06
    • 2021-07-10
    • 2021-01-21
    相关资源
    最近更新 更多