XPath条件文本节点选择

时间:2010-12-24 08:16:48

标签: javascript dom xpath

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

  • 该表是具有特定action属性值的表单的后代。
  • 选定的后代是文本节点。
  • 文本节点内容只能包含空格。

它可能看起来像:

//form[@action = "submit.html"]//table//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,并遇到许多其他人在意外的空文本节点甩掉结果时遇到的同样问题。这个函数通过简单地删除所有空文本节点来帮助我,使我的迭代逻辑可以保持简单。

2 个答案:

答案 0 :(得分:3)

  你好。我需要构建一个xpath   用于选择a的所有后代的字符串   某些表符合以下条件:

     

•表格是表格的后代   具有特定的动作属性   值。

     

•选定的后代是   文本节点。

     

•文本节点内容可以   只包含空格。

使用

//form[@action = "submit.html"]//table//text()[not(normalize-space())]

这将选择所有仅包含空格的文本节点,这些节点是任何table的后代,它是任何具有form属性值{“1}}的{​​{1}}的后代html的”。

答案 1 :(得分:1)

仅包含空格的文本节点将从文档表示中剥离 - 即实际上不存在节点。这意味着您无法访问文本本身,但您可以做的是使用not()匹配缺少文本节点的父级 - 类似于:

//form[@action = "submit.html"]//table//*[not(text())]

虽然在你的情况下,我猜这将比你实际打算更具侵略性。顺便说一下,小心这些//匹配,它们效率不高,而且非常具有侵略性。

(我刚刚注意到这不是一个XSLT问题!如果你在JS领域,你是否考虑过使用DOM方法来获取你的列表?)