通过XPath获取所有冗余元素

时间:2016-03-06 21:06:41

标签: xml xpath dtd

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

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

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

2 个答案:

答案 0 :(得分:3)

例如,您可以搜索与其后的标题完全相同的title

//title[.=following::title]

答案 1 :(得分:1)

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

  1. 如果您希望所有title个元素出现多次,您可以使用此XPath 1.0表达式:

    //title[.=following::title or .= preceding::title]
    
  2. 如果您要选择在文档中出现多次的所有title元素的集合(没有重复),则可以使用此XPath 1.0表达式:

    //title[.=following::title][not(. = preceding::title)]
    
  3. 要了解其中的差异,请考虑使用此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选择:

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

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

    XPath#2选择:

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

    要么可以满足您的目的,具体取决于您对结果的确切要求。