Ruby LibXML - если узел существует, фильтруйте по значению

Я работаю над следующим XML:

<digiprovMD ID="digiprov-3">
<mdWrap MDTYPE="PREMIS">
<xmlData>
  <agent>
    <agentIdentifier>
      <agentIdentifierType>URI</agentIdentifierType
      <agentIdentifierValue>info:fda/system-v0.16.2</agentIdentifierValue>
      <agentIdentifierResult>outcome</agentIdentifierResult>
    </agentIdentifier>
    <agentName>DAITSS Account: UF</agentName>
    <agentType>Affiliate</agentType>
  </agent>
</xmlData>
</mdWrap>
</digiprovMD>
<digiprovMD ID="digiprov-4">
<mdWrap MDTYPE="PREMIS">
<xmlData>
  <agent>
    <agentIdentifier>
      <agentIdentifierType>URI</agentIdentifierType>
      <agentIdentifierValue>info:fda/system-v0.16.2</agentIdentifierValue>              
    </agentIdentifier>
    <agentName>daitss system (v0.16.2)</agentName>
    <agentType>software</agentType>
  </agent>
</xmlData>
</mdWrap>
</digiprovMD>
<digiprovMD ID="digiprov-5">
<mdWrap MDTYPE="PREMIS">
<xmlData>
  <agent>
    <agentIdentifier>
      <agentIdentifierType>URI</agentIdentifierType>
      <agentIdentifierValue>info:fda/system-v0.16.2</agentIdentifierValue>
      <agentIdentifierResult>source</agentIdentifierResult>              
    </agentIdentifier>
    <agentIdentifier>
      <agentIdentifierType>URI</agentIdentifierType>
      <agentIdentifierValue>someotheruri</agentIdentifierValue>
      <agentIdentifierResult>outcome</agentIdentifierResult>              
    </agentIdentifier>
    <agentName>daitss system (v0.16.2)</agentName>
    <agentType>software</agentType>
  </agent>
</xmlData>
</mdWrap>
</digiprovMD>

Я хочу выбрать всех агентов с определенным значением agentIdentifierValue, например, info:fda/system-v0.16.2, только если 1. с ним не связан тег agentIdentifierResult и 2. если с ним связан agentIdentifierResult, его значение должно быть "исход"

Поэтому в этом случае должны быть выбраны оба агента, дигипров-3 и дигипров-4. Как мне написать xpath для этого?

Я пробовал это (псевдокод): (результат = результат и значение = '#{uri.content}') или (значение = '#{uri.content}')), но при этом выбирается и третий агент - дигипров-5!

1 ответ

Решение

Это должно работать:

'//digiprovMD[.//agentIdentifier[./agentIdentifierValue="info:fda/system-v0.16.2"][not(./agentIdentifierResult) or ./agentIdentifierResult = "outcome"]]'

В основном это возвращает любые узлы digiprovMD, которые включают в себя узел agentIdentifier с указанным значением agentIdentifierValue, а также ни agentIdentifierResult, ни agentIdentifierResult для "result".

Другие вопросы по тегам