检测第一个非空元素

时间:2016-03-31 14:49:55

标签: xpath

在阅读了关于检测空节点的最相关的Xpath问题之后,我仍然找不到第一个非空元素。数据集如下所示:

<div> 
  <p>
    <elem>&#xa0;</elem>
  </p>
  <p>
    <elem>&nbsp;</elem>
  </p>
  <p>
    <elem>&#xa0;</elem>
  </p>
  <p>
    <elem>&#xa0;&#xa0;&#xa0;</elem>
  </p>
  <p>
    <elem>Application</elem>
  </p>
  <p>
    <elem>Other text that should not be detected.</elem>
  </p>
  <p>
    <elem>&#xa0;</elem>
  </p>
  <p>
    <elem>Second application</elem>
  </p>
</div>

基本上不应考虑空元素,我们只想检测第一个Application元素。我们已经使用normalize-space及相关功能进行了大量测试,但无法正常使用。

主要问题是空元素。我们现在的检查完美地解决了定位,但是一旦html包含&nbsp;元素就失败了:

/div/p[position() < 3]//*[normalize-space()='Application']

那么,我们怎样才能忽略空元素呢?这只能通过两者之间的额外步骤来实现吗?

1 个答案:

答案 0 :(得分:0)

在我的定义中,空元素没有任何子节点,因此normalize-space将按该定义选择所有空元素。如果您想允许某些文字内容,则可以在删除后检查//*[not(*) and not(normalize-space(translate(., '&#160;', '')))],例如translate。基本上,在使用normalize-space检查之前,您需要将所有字符列为要删除的// npm install --save-dev gulp merge-stream var gulp = require('gulp'); var merge = require('merge-stream'); gulp.task('test', function() { var bootstrap = gulp.src('bootstrap/js/*.js') .pipe(gulp.dest('public/bootstrap')); var jquery = gulp.src('jquery.cookie/jquery.cookie.js') .pipe(gulp.dest('public/jquery')); return merge(bootstrap, jquery); }); 调用的第二个参数。我编写的XPath表达式可以在XSLT中工作,其中数字字符引用由XML解析器解析,通常它取决于您使用XPath的宿主语言以及如何转义字符。