Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XPath条件文本节点选择_Javascript_Dom_Xpath - Fatal编程技术网

Javascript 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

我需要构造一个xpath字符串来选择具有以下条件的某个表的所有后代:

  • 该表是具有特定
    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表达式)解决方案:)