Xpath получает элемент, который лежит между двумя элементами с определенными атрибутами - PullRequest
0 голосов
/ 11 мая 2018

Пример 1

   <w:r>
        <w:t>gene</w:t>
   </w:r>
   <w:ins>
        <w:t>s</w:t>
   </w:ins>
   <w:r>
        <w:t> </w:t> #I want to select this element
   </w:r>
   <w:del >
        <w:t>house</w:t>
   </w:del>
   <w:r>
        <w:t>had</w:t>
   </w:r>
   <w:r>
        <w:t> </w:t>  #I do not want to select this element
   </w:r>
   <w:ins >
        <w:t>under</w:t>
   </w:ins>
   <w:del>
        <w:t>in</w:t>
    </w:del>
    <w:r>
        <w:t> </w:t>  #I want to select this element
    </w:r>
    <w:ins>
        <w:t>the</w:t>
    </w:ins>

Пример 2

  <w:r>
    <w:t>specific genes</w:t>
  </w:r>
  <w:ins>
      <w:t>;</w:t>
  </w:ins>
  <w:del>
      <w:t>,</w:t>
  </w:del>
  <w:r>
    <w:t> </w:t>  #I don't want to select this one
  </w:r>
  <w:r>
    <w:t>SO</w:t>
  </w:r>

Элементы, которые я хочу выбрать, указаны выше.Элементам w: r, которые содержат пробел, должен предшествовать непосредственно элемент w: ins или w: del, а также сразу должен следовать элемент w: ins или w: del

Я начал со следующеговыражение, но это не принимает во внимание, что предыдущий брат может быть элементом aw: del.Аналогично для следующих братьев и сестер.Кроме того, он должен проверить элемент непосредственно перед или сразу после него, чтобы увидеть, есть ли его элемент aw: ins или w: del.

search ("// w: r [. = '' И previous-sibling :: w: ins и follow-sibling :: w: del] ")

Однако, похоже, это не работает, так как выбираются все элементы w: r, содержащие пробел.

Я использую Нокогири.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Мне наконец-то удалось найти правильное решение или хотя бы одно, которое дает мне желаемый результат:

search("//w:r[. = ' ' and following-sibling::*[position()=1][name()='w:del' or name()='w:ins']and preceding-sibling::*[position()=1][name()='w:del' or name()='w:ins']]")
0 голосов
/ 11 мая 2018

Вы можете попробовать следующее xpath:

//*[local-name()='r' and node()='' and preceding-sibling::*[local-name()='ins'] and following-sibling::*[local-name()='ins'] ]

Вводы:

more example1.xml 
<?xml version="1.0"?>
<root xmlns:w="http://so.com">
  <w:r>
    <w:t xml:space="preserve">gene</w:t>
  </w:r>
  <w:ins>
    <w:r>
      <w:t>s</w:t>
    </w:r>
  </w:ins>
  <w:del>
    <w:r>
      <w:delText>,</w:delText>
    </w:r>
  </w:del>
  <w:r><w:t xml:space="preserve"/>  #I want to select this element
      </w:r>
  <w:ins>
    <w:r>
      <w:t>under</w:t>
    </w:r>
  </w:ins>
  <w:del>
    <w:r>
      <w:delText>in</w:delText>
    </w:r>
  </w:del>
  <w:r>
    <w:t xml:space="preserve">both</w:t>
  </w:r>
  <w:del>
    <w:r>
      <w:delText xml:space="preserve">the</w:delText>
    </w:r>
  </w:del>
</root>

2-й файл:

more example2.xml
<?xml version="1.0"?>
<root xmlns:w="http://so.com">
  <w:r>
    <w:t xml:space="preserve">phenotypic specific genes</w:t>
  </w:r>
  <w:ins>
    <w:r>
      <w:t>;</w:t>
    </w:r>
  </w:ins>
  <w:del>
    <w:r w:rsidDel="00167AE4" w:rsidRPr="006C5D4F">
      <w:delText>,</w:delText>
    </w:r>
  </w:del>
  <w:r><w:t xml:space="preserve"/> #I don't want to select this one
  </w:r>
  <w:r w:rsidRPr="006C5D4F">
    <w:t>SOX9</w:t>
  </w:r>
</root>

результаты:

example1.xml

$xmllint --xpath "//*[local-name()='r' and node()='' and preceding-sibling::*[local-name()='ins'] and following-sibling::*[local-name()='ins'] ]" example1.xml
<w:r>
    <w:t xml:space="preserve"/>  #I want to select this element
</w:r>

example2.xml

$ xmllint --xpath "//*[local-name()='r' and node()='' and preceding-sibling::*[local-name()='ins'] and following-sibling::*[local-name()='ins'] ]" example2.xml 
XPath set is empty
...