来自xpath查询的子集?

时间:2015-05-05 01:38:27

标签: xml xpath

我的XML大致如下:

<Dispatch ID = "JJJJ">
    <Log ID = "150504BCFSP00072">
        <LogTime>"May  4 2015  5:48PM"</LogTime>
        <LogType>"1125-KKKK"</LogType>
        <LogDetails>
            <details>
                <DetailTime>"May  4 2015  5:48PM"</DetailTime>
                <IncidentDetail>"[1] The Thing I Want"</IncidentDetail>
                 <DetailTime>"May  4 2015  5:49PM"</DetailTime> 
                <IncidentDetail>"[2] The Thing I Don't Want"</IncidentDetail>
            </details>
         </LogDetails>
    </Log>
</Dispatch>

我想从Station ID为JJJJ的日志中提取所有IncidentDetail文本,&amp;其LogType包含“KKKK”,其IncidentDetail以[1]开头(使其成为可能很多的第一次更新)。到目前为止,我有这个XPATH查询:

//Dispatch[@ID='JJJJ']//Log/LogType[contains(.,'KKKK')]

这会给我一个事件列表,如下所示:

Element='<LogType>"1125-KKKK"</LogType>'
Element='<LogType>"1125-KKKK"</LogType>'
Element='<LogType>"1125-KKKK"</LogType>'

但这只会让我陷入困境。我现在如何向后退并获取与我正在寻找的每个LogType事件相同的IncidentDetail文本?有一些多步骤的过程吗?

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

尝试//Dispatch[@ID='JJJJ']//Log/LogType[contains(.,'KKKK')]//IncidentDetail

答案 1 :(得分:0)

您可以将其作为谓词放置在主轴上,而不是单步执行Log/LogType

//Dispatch[@ID='JJJJ'][Log/LogType[contains(.,'KKKK')]]

或其他方式:

//Dispatch[@ID='JJJJ' and Log/LogType[contains(.,'KKKK')]]

从这里开始,您可以轻松地继续使用主轴进入IncidentDetail而无需向后移动:

/Log/LogDetails/details/IncidentDetail

关于更新:

您可以使用xpath索引添加过滤器以仅获取同一父级中的第一个IncindentDetail

/Log/LogDetails/details/IncidentDetail[1]

或按节点的文字内容进行过滤:

/Log/LogDetails/details/IncidentDetail[contains(.,'[1]')