Javascript XPath条件文本节点选择
我需要构造一个xpath字符串来选择具有以下条件的某个表的所有后代:Javascript XPath条件文本节点选择,javascript,dom,xpath,Javascript,Dom,Xpath,我需要构造一个xpath字符串来选择具有以下条件的某个表的所有后代: 该表是具有特定action属性值的表单的后代 选定的子体是文本节点 文本节点内容只能包含空格 它可能看起来像: //form[@action = "submit.html"]//table//text()[ ...? ] //form[@action = "submit.html"]//table//*[not(text())] 任何提示都将不胜感激。谢谢 编辑:这是我以前的工作折衷方案: function KillT
- 该表是具有特定
属性值的表单的后代action
- 选定的子体是文本节点
- 文本节点内容只能包含空格
//form[@action = "submit.html"]//table//text()[ ...? ]
//form[@action = "submit.html"]//table//*[not(text())]
任何提示都将不胜感激。谢谢
编辑:这是我以前的工作折衷方案:
function KillTextNodes(rootpath)
{
XPathIterate(rootpath + '//text()', function(node)
{
var tagname = node.parentNode.tagName;
if (tagname != 'OPTION' && tagname != 'TH')
Kill(node);
});
}
以下是我基于公认答案的功能:
function KillTextNodes(rootpath)
{
XPathIterate(rootpath + '//text()[not(normalize-space())]', function(node) { Kill(node); });
}
为了稍微解释一下我的动机,我使用Javascript在DOM中迭代,遇到了许多其他人遇到的相同问题,即意外的空文本节点会抛出结果。这个函数通过简单地删除所有空文本节点来帮助我,这样我的迭代逻辑就可以保持简单。只包含空格的文本节点将从文档表示中剥离,即实际上不会有节点。这意味着您无法访问文本本身,但您可以使用
not()
匹配缺少文本节点的父节点,类似于:
//form[@action = "submit.html"]//table//text()[ ...? ]
//form[@action = "submit.html"]//table//*[not(text())]
虽然在你的情况下,我想这将远远超过你的实际意图。顺便说一句,小心这些//匹配,它们不是很有效,而且也很有攻击性
(我刚刚注意到这不是XSLT问题!如果您在JS领域,您是否考虑过使用DOM方法获取列表?)
你好。我需要构造一个xpath
字符串以选择一个对象的所有子对象
具有以下条件的特定表格:
•表格是表格的后代
具有特定的动作属性
价值观
•选定的子代是
文本节点
•文本节点内容可以
只包含空格
使用:
//form[@action = "submit.html"]//table//text()[not(normalize-space())]
这将选择所有文本节点,这些节点中只有空格,并且是任何
表的后代,该表是任何表单的后代,具有值为“submit.html”的action
属性,但应用XPath比纯DOM更可取,因为纯DOM需要递归(据我所知)。关于剥离:运行Firefox 3.6.13,我添加到问题中的示例代码确实会返回纯空白文本节点,以及其他文本节点。您可能会遇到x浏览器问题-我使用IE7和XSLT编辑器进行了测试-剥离似乎取决于相关引擎。我正在为Greasemonkey开发,所以目标浏览器的列表很窄,但我会记住这一点。假设我确实在文档表示中有适当的节点,我可以使用这个normalize-space()
东西,或者使用正则表达式来进行XPath选择吗?@Reinderien:如果只保留空白文本节点,那么您可以使用//form[@action=“submit.html”]//table//text()[not(normalize-space())]
或//form[@action=“submit.html”]//table//text()[normalize-space()='']
好问题,+1.请参阅我的答案,以获得完整而简单的(一行XPath表达式)解决方案:)