我有一个 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 , 如果 select 属性包含文字字符串,则该字符串必须位于引号内。
但是该变量可能包含类似“'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);
}
};
最佳答案
这对于写在注释中来说有点太长了,但假设您将 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例如。
关于javascript - 当字符串包含单引号时使用js替换XSL变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184997/