1

这是我的 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 返回正确 = 1249164523

max(/FinancialSummary/SummaryDate)

此 xpath 返回正确 = 20111231

但是,当我尝试将两者结合起来时,什么都没有返回

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

有什么我想念的吗?这个谜题的解决方案是什么?

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

4

3 回答 3

3

这有效(注意//而不是/在谓词中转移到上下文父级):

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

但是,根据文档的实际结构提供直接路径会更好(即更严格和更有效)。FinancialSummary

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

  • 您提供了格式不正确的 XML 示例
  • 您的表达式从根 ( /) 开始,但您的实际文档可能不包含根FinancialSummary(因为看起来这些元素在树中更靠后)
于 2012-01-19T16:04:07.453 回答
1

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

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

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

编辑

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

于 2012-01-19T15:55:10.683 回答
0

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

要对此进行测试,请尝试

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

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

于 2012-01-19T16:36:03.130 回答