通过 XPath 获取所有冗余元素

Get all redundant elements via XPath

如何通过XPath获取所有出现不止一次的元素?

<!DOCTYPE book [
<!ELEMENT book (title,section+)>
<!ELEMENT chapter (title,body?,section*)>
<!ELEMENT title (#PCDATA)>
<!ATTLIST chapter number ID CDATA #REQUIRED>
]>

我需要出现不止一次的所有 title 个元素。

例如,您可以搜索 title 与其后面的标题相同的内容:

//title[.=following::title]

XPath 1.0 解决方案(也适用于 XPath 2.0)

  1. 如果你想要所有 title 元素出现不止一次,你可以使用这个 XPath 1.0 表达式:

    //title[.=following::title or .= preceding::title]
    
  2. 如果您想要 select 一组(没有重复项)所有 title 元素在文档中出现多次,您可以使用此 XPath 1.0表达式:

    //title[.=following::title][not(. = preceding::title)]
    

要查看差异,请考虑以下 XML(根据您的 DTD 无效,但作为示例仍然有用):

<r>
  <title>a</title>
  <title>b</title>
  <title>c</title>
  <title>a</title>
  <title>a</title>
  <title>b</title>
  <title>b</title>
  <title>b</title>
</r>

XPath #1 selects:

<title>a</title>
<title>b</title>
<title>a</title>
<title>a</title>
<title>b</title>
<title>b</title>
<title>b</title>

(示例中除 c title 之外的所有 title 元素)

XPath #2 selects:

<title>a</title>
<title>b</title>

两者都可能符合您的目的,具体取决于您需要对结果执行的操作。