【问题标题】:Ruby LibXML - If a node exists, filter based on valueRuby LibXML - 如果节点存在,则根据值进行过滤
【发布时间】:2012-10-12 15:58:36
【问题描述】:

我正在处理以下 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,它的值应该是'outcome'

所以在这种情况下,应该选择两个代理,digiprov-3 和 digiprov-4。 如何为此编写 xpath?

我试过这个(伪代码): (result = 结果和 value = '#{uri.content}') 或 (value = '#{uri.content}') 但这也选择了第三个代理 digiprov-5!

【问题讨论】:

  • XML 是否正确? 'digiprov-5' 应该有两个 agentIdentifier 节点吗?
  • @JustinKo:是的,xml 是正确的。它应该有两个 agentIdentifier 节点

标签: ruby libxml2 libxml-ruby


【解决方案1】:

这应该可行:

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

基本上,这将返回任何 digiprovMD 节点,其中包括具有指定 agentIdentifierValue 值的 agentIdentifier 节点,以及没有 agentIdentifierResult 或 agentIdentifierResult 为“结果”。

【讨论】:

  • 谢谢贾斯汀。但是 XML 应该有 2 个代理标识符节点。
  • 我已更新答案以纠正我的错误假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多