我有一个XSL对象。我想提取一组选定的节点。另一个人或团队编写了XSL文档和选择这些节点的代码行,但它只适用于IE,我试图使其跨浏览器兼容。
XSL文件
<!-- snippet of XSL file -->
<xsl:variable name="title">aaa</xsl:variable>
<xsl:variable name="col1">CSV00001</xsl:variable>
<xsl:variable name="col2">CSV00002</xsl:variable>
<xsl:variable name="col3">CSV00003</xsl:variable>
<xsl:variable name="col4">CSV00004</xsl:variable>
<xsl:variable name="col5">CSV00005</xsl:variable>
<xsl:variable name="col6">CSV00006</xsl:variable>
<xsl:variable name="col7">CSV00007</xsl:variable>
<xsl:variable name="col8">CSV00008</xsl:variable>
<xsl:variable name="col9">CSV00009</xsl:variable>
JS档案
// Extract title and column nodes
var varNodes = $(csvXsl).find("xsl\\:variable");
我尝试引用这篇文章作为想法,Handling a colon in an element ID in a CSS selector,但这是针对CSS的。但我确实尝试将\:
替换为\\3A
,\\3a
,3a
,3A
,但这些都没有。
有什么建议吗?
根据要求,这里有关于如何创建XSL对象的更多信息。
function loadXml(xmlFilePath) {
var retObj = null ;
var timeUniq = (new Date()).getTime();
// check protocol
var protocol = document.location.protocol;
if(protocol.toLowerCase().indexOf("http")>=0){
$.ajax({
url: xmlFilePath + "?t=" + timeUniq,
type: 'get',
dataType: 'xml',
async: false,
timeout: 1000
})
.done(
function(xml, status){
if( status != 'success' ){
return;
}
retObj = xml;
})
.fail(
function(xhr, textStatus){
return;
});
}
return retObj;
}
csvXsl = loadXml("./xsl/OrderListCSV.xsl");
谢谢。
更新
根据要求,我添加了一个小提琴。
UPDATE2
使用JSFiddle例程,充分利用评论员Niet。
如果链接断开,则以下是相关部分:
// Workaround for JQuery bug, primarily using Vanilla JS.
function serializeXmlNode(xmlNode) {
if (typeof window.XMLSerializer != "undefined") {
return (new window.XMLSerializer()).serializeToString(xmlNode);
} else if (typeof xmlNode.xml != "undefined") {
return xmlNode.xml;
}
return "";
}
var tmpStr = serializeXmlNode(csvXsl); // Converts XML/XSL object to String
var tmp = document.createElement('div');
tmp.innerHTML = csvXsl; // Does not work
tmp.innerHTML = tmpStr; // This one works, had to serialize object first
var varNodes = tmp.getElementsByTagName('xsl\:variable'); // Works
var varNodes2 = tmp.getElementsByTagName('xsl:variable'); // Also works
答案 0 :(得分:1)
我会做一些调试这个问题的步骤:
检查csvXls变量的内容,您可以尝试例如查找:
console.log(csvXsl)
然后
$(csvXsl).find("xsl\\:variable");
或$("xsl\\:variable",csvXsl);
如果该变量包含正确的节点,例如<xsl:variable name="col9">CSV00009</xsl:variable>
,那么它可能是jQuery中的一个错误,我觉得要在这样的基本选择器中排除。
发布如何通过更多背景信息获取csvXsl
,以便我们为您提供更好的帮助。
答案 1 :(得分:1)
这确实是jQuery中的一个错误。
请尝试使用Vanilla JS:
var tmp = document.createElement('div');
tmp.innerHTML = csvXsl;
var varNodes = tmp.getElementsByTagName('xsl:variable');
答案 2 :(得分:0)
必须通过&#39;回答&#39;因为没有足够的代表
行:
var inputTag = $("#test\\:1").val());
在小提琴中据说显示了什么有效:http://jsfiddle.net/dNDN6/2/
实际上在Chrome / webkit中不起作用
正确的方法是首先在没有命名空间(冒号后)的标签上使用普通JS和getElementsByTagName,如果没有元素则使用完整标签,如下所示:
var x = xmlDoc.getElementsByTagName("variable");
if (!x[0]) x = xmlDoc.getElementsByTagName('xsl:variable');
x将包含您的数组[跨浏览器]