XPath - извлечь значение из родителя с наибольшим значением узла - PullRequest
1 голос
/ 19 января 2012

Это мой фрагмент 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 с наибольшим числовым значением суммарной даты.

/FinancialSummary[SummaryDate = '20111231']/Revenue

этот xpathвозвращает правильный = 1249164523

max(/FinancialSummary/SummaryDate)

этот xpath возвращает правильный = 20111231

однако при попытке объединить оба ничего не возвращается

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

Есть что-то, что я пропускаю?Каково решение этой загадки?

дополнительная информация: я пробовал содержать вместо '=', но с этим не повезло

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Это работает (обратите внимание // вместо / и переход к родительскому контексту в предикате):

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

Тем не менее, было бы еще лучше (то есть более строго и эффективно) предоставить прямой путь к FinancialSummary, который основан на фактической структуре вашего документа.

Проблемы в вашем примере XML и предлагаемое решение:

  • Вы предоставили образец XML, который не является правильно сформированным
  • Ваше выражение начинается с корня (/), но ваш фактический документ, вероятно, не содержит корня FinancialSummary (так как кажется, что эти элементы находятся ниже в дереве)
1 голос
/ 19 января 2012

Я думаю, что это выражение отвечает на ваш вопрос:

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

Контекст в вашем предикате - FinancialSummary. Вы должны встать в этом дереве, чтобы получить другие. Это выражение может возвращать несколько узлов, если некоторые имеют одинаковую дату.

РЕДАКТИРОВАТЬ :

Я удаляю первый слеш. Следствие : Вы должны быть в правильном контексте (родитель FinancialSummary), чтобы запустить этот запрос XPath.

0 голосов
/ 19 января 2012

Интересно, причина, по которой это не работает, когда объединяются два XPath, заключается в том, что в первом случае вы сравниваете SummaryDate со строкой, '20111231', но во втором случае вы сравниваете SummaryDate с число, max(...).

Чтобы проверить это, попробуйте

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

Кроме того, я согласен с @Able и @lwburk в том, что это было бы менее запутанным, если бы вы не попытались обработать некорректно сформированный образец XML (несколько элементов верхнего уровня), как если бы это был настоящий документ XML (адресованный с использованием "/Сводные финансовые показатели/..."). Я предполагаю, что вы пытаетесь быть краткими и сообщаете только то, что, по вашему мнению, имеет отношение к проблеме. Но это, очевидно, не правильно, и это вызывает всевозможные тревоги. Ясность об этом поможет.

...