XPath - 从具有最高节点值的父级中提取值

时间:2012-01-19 15:50:37

标签: xml xpath xsd xpath-2.0

这是我的XML代码段

    <FinancialSummary>
            <SummaryDate format="YYYYMMDD">20111231</SummaryDate>
            <Revenue currency="EUR">1249164523</Revenue>
    </FinancialSummary>
    <FinancialSummary>
            <SummaryDate format="YYYYMMDD">20101231</SummaryDate>
            <Revenue currency="EUR">1242344523</Revenue>
    </FinancialSummary>
    <FinancialSummary>
            <SummaryDate format="YYYYMMDD">20091231</SummaryDate>
            <Revenue currency="EUR">324900932</Revenue>
    </FinancialSummary>

我尝试使用最高的数字摘要值从财务摘要标记中的收入节点中提取节点内容。

/FinancialSummary[SummaryDate = '20111231']/Revenue

此xpath返回correct = 1249164523

max(/FinancialSummary/SummaryDate)

此xpath返回correct = 20111231

然而,当我尝试结合时,都没有返回

/FinancialSummary[SummaryDate = max(/FinancialSummary/SummaryDate)]/Revenue

我有什么遗失的吗?这个谜题有什么解决方案?

额外信息:我试过包含而不是'=',但没有运气

3 个答案:

答案 0 :(得分:3)

这可行(注意//而不是/以及转移到谓词中的上下文parent:

//FinancialSummary[SummaryDate=max(../FinancialSummary/SummaryDate)]/Revenue

然而,基于您的文档的实际结构,提供FinancialSummary的直接路径将更好(即更严格,更高效)

示例XML和建议的解决方案中的问题:

  • 您提供的XML样本格式不正确
  • 您的表达式从根(/)开始,但您的实际文档可能不包含根FinancialSummary(因为看起来这些元素在树中更下方)

答案 1 :(得分:1)

我认为这个表达式回答了你的问题:

FinancialSummary[SummaryDate = max(./parent::*/FinancialSummary/SummaryDate)]/Revenue

谓词中的上下文是FinancialSummary。你必须站起来才能得到其他人。如果某些节点具有相同的日期,则此表达式可以返回多个节点。

编辑

我删除了第一个斜杠。 后果:您必须处于正确的上下文(FinancialSummary的父级)才能启动此XPath查询。

答案 2 :(得分:0)

我想知道当合并两个XPath时它不起作用的原因是,在第一种情况下,您将SummaryDate与字符串'20111231'进行比较,但在第二种情况下,您正在比较SummaryDate一个数字,max(...)

要测试此功能,请尝试

/FinancialSummary[SummaryDate =
     string(max(/FinancialSummary/SummaryDate))]/Revenue

另外,我同意@Able和@lwburk的观点,如果你不试图将格式错误的XML样本(多个顶级元素)视为一个真正的XML文档(使用“/ FinancialSummary / ...”)。我想你想要简短并只传达你认为与问题相关的内容。但它显然不对,它引发了各种各样的警报。澄清这一点会有所帮助。