我的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的Accordint,如果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);
}
};
答案 0 :(得分:1)
这个时间太长了,无法写评论,但是假设您将someText
设置为“ Hey”。如果您只是这样做
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以使用参数。我认为,不仅如此,因为Internet Explorer仅支持“ selectSingleNode”。
如果您可以更改XSLT以使用参数,则StackOverflow上还有其他问题,表明您必须使用Java脚本设置参数。例如,请参见How to pass parameter to XSLT from Javascript function。