2012-10-12 40 views
0

我在下面的XML工作:紅寶石的libxml - 如果一個節點存在,過濾器基於價值

<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的特定值的所有代理說信息:FDA /系統-V0 .16.2,只有 1.它具有與其關聯沒有agentIdentifierResult標籤和 2.如果有與它assocaited的agentIdentifierResult其值應爲「結果」

因此,在這種情況下,這兩種藥物,digiprov-3和應該選擇digiprov-4。 如何爲此寫入xpath?

我嘗試這樣做(僞代碼): (結果=結果和值= '#{uri.content}')或(值= '#{uri.content}') 但這選擇第三劑digiprov-5呢!

+0

XML是否正確? 'digiprov-5'應該有兩個agentIdentifier節點嗎? –

+0

@JustinKo:是的,XML是正確的。它應該有兩個agentIdentifier節點 – aakash

回答

1

這應該工作:

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

基本上這是回訪任何digiprovMD節點,其包括具有指定agentIdentifierValue值的agentIdentifier節點,以及要麼沒有agentIdentifierResult或「結果」的agentIdentifierResult。

+0

謝謝賈斯汀。但是XML應該有2個代理標識符節點。 – aakash

+0

我已更新答案以糾正我錯誤的假設。 –

+0

謝謝Justin。這很好。 – aakash