【问题标题】:XPath doesn't return results from documentXPath 不从文档返回结果
【发布时间】:2013-11-15 18:10:57
【问题描述】:

我正在尝试这个 XPath 查询,但它返回一个空枚举。 有人熟悉这个问题吗? AJAX 加载的 XML 上的其他 XPath 查询工作正常。 文档是 XHTML1.1 我怀疑 xhtml 命名空间 (xmlns="http://www.w3.org/1999/xhtml")

始终显示 0。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<table id="tbl">
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
<tr><td>7</td><td>8</td><td>9</td></tr>
</table>
</body>
<script>
//ORIGINAL: var result = document.evaluate('table#tbl/tr/td[3]/text()', document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var result = document.evaluate('//body', document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var node;
var c = 0;
while (node = result.iterateNext()) c++;
alert(c);       // Always 0??? Why?
</script>
</html>

【问题讨论】:

    标签: javascript xml dom xpath xhtml


    【解决方案1】:

    这是对 XHTML 的完整修复。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
    <table id="tbl">
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>4</td><td>5</td><td>6</td></tr>
    <tr><td>7</td><td>8</td><td>9</td></tr>
    </table>
    </body>
    <script>
    var f = function(prefix) {alert(prefix);
      var ns = {'h' : 'http://www.w3.org/1999/xhtml'};
      return ns[prefix] || null;
    };
    var result = document.evaluate('//h:table[@id="tbl"]/h:tr/h:td[3]/text()', document, f, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var node;
    while (node = result.iterateNext()) alert(node.nodeName);
    </script>
    </html>
    

    【讨论】:

      【解决方案2】:

      如果您的 &lt;html&gt; 在命名空间中,则您正在运行的查询实际上是针对空命名空间运行的。

      document.evaluate 中的第三个参数指的是 namespaceResolver,它执行它在 tin 上所说的 - 根据名称空间前缀 [1] 解析名称空间。

      现在您既可以拥有一个动态的,也可以创建自己的,这取决于您使用的文档是您自己的还是可以更改的。

      假设命名空间前缀为空(大多数情况下看起来都是这样),您希望将 null 替换为 nsResolver,这样 [3]:

      function nsResolver(prefix) {
        var ns = {
          '' : 'http://www.w3.org/1999/xhtml'
        };
        return ns[prefix] || null;
      }
      

      或者,请参阅动态示例,从长远来看可能会节省您的时间 [2]。

      参考文献

      1. https://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript
      2. https://developer.mozilla.org/en/docs/Web/API/document.createNSResolver
      3. https://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver

      【讨论】:

      • +1 给我正确的方向。顺便说一句,如果 XPath 元素中没有前缀,则没有 nsResolver 回调。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      相关资源
      最近更新 更多