基于精确顺序遍历Javascript?

时间:2019-06-18 07:34:22

标签: javascript html xpath dom-traversal document.evaluate

我想掌握格式不同的文档中的一些信息。

我有以下文件:

var getSORMARC = document.evaluate("//*[@id='marcview']/tbody/tr[contains(., '245')]/following-sibling::tr[contains(.,'_c')]/td[contains(.,'_c')]/following-sibling::td[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (getSORMARC.singleNodeValue !== null) {
  var SORMARC = getSORMARC.singleNodeValue.innerText;
}
console.log(SORMARC);
<table id="marcview">
  <tbody>
    <tr>
      <td>
        <b>Title</b>
      </td>
      <td>245</td>
      <td>&nbsp;</td>
      <td>0</td>
      <td>_a</td>
      <td>Title of the document /</td>
    </tr>
    <tr>
      <td>_c</td>
      <td>Author no. 1</td>
    </tr>
  </tbody>
</table>

和其他文档:

var getSORMARC = document.evaluate("//*[@id='marcview']/tbody/tr[contains(., '245')]/following-sibling::tr[contains(.,'_c')]/td[contains(.,'_c')]/following-sibling::td[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (getSORMARC.singleNodeValue !== null) {
  var SORMARC = getSORMARC.singleNodeValue.innerText;
}
console.log(SORMARC);
<table id="marcview">
  <tbody>
    <tr>
      <td>
        <b>Title</b>
      </td>
      <td>245</td>
      <td>&nbsp;</td>
      <td>0</td>
      <td>_a</td>
      <td>Title of another document/</td>
    </tr>
    <tr>
      <td>
        <b>Publication</b>
      </td>
      <td>260</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>_c</td>
      <td>1995</td>
    </tr>
  </tbody>
</table>

如您所见,我在两个文档中都使用了XPath选择器:

//*[@id='marcview']/tbody/tr[contains(., '245')]/following-sibling::tr[contains(.,'_c')]/td[contains(.,'_c')]/following-sibling::td[1]

问题是,如果文档不包含文本内容为"_c"的元素,而该元素直接是文本内容为"245"的父元素的祖先(孩子),它仍然会给我_c的{​​{1}}的同级文本包含文本<td>,并非如此。

如果运行了javascript代码,它将为我提供以下信息: 第一份文件:作者编号1个 第二份文件:(无)。

我实际上只想捕获"Publication"具有直接祖先_c<td>245</td>的文本内容。

关于如何做到这一点,我无能为力。我正在尝试以<td>Title ...</td>开始我的xpath,但是出现一些错误。关于如何使用我的用例有什么想法?

如果可以使用_c以外的其他方法来实现,那么我很好。

0 个答案:

没有答案