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".