2013-06-14 3 views
0

Редактирование: я думаю, что нашел ответ, но я оставлю открытое немного, чтобы узнать, есть ли у кого-то коррекция/улучшение.xpath - соответствие значения дочернего элемента в текущем узле со значением элемента в родительском

Я использую xpath в инструменте etl Talend. У меня есть XML, как это:

<root> 
<employee> 
    <benefits> 
    <benefit> 
     <benefitname>CDE</benefitname> 
     <benefit_start>2/3/2004</benefit_start> 
    </benefit> 
    <benefit> 
    <benefitname>ABC</benefitname> 
    <benefit_start>1/1/2001</benefit_start> 
    </benefit> 
    </benefits> 
<dependent> 
    <benefits> 
    <benefit> 
    <benefitname>ABC</benefitname> 
</benefit> 
</dependent> 

При анализе преимуществ для иждивенцев, я хочу, чтобы получить элементы, присутствующие в выгоды элемента работника. Таким образом, в приведенном выше примере, я хочу получить 1/1/2001 для начальной даты зависимого . Я хочу 1/1/2001, а не 2/3/2004, потому что преимущество зависимого имеет преимущество ABC, соответствующее вознаграждению сотрудника с тем же самым преимуществом.

Что XPath, по отношению к/корневой/сотрудника/зависимый/выгоды/пользу, даст значение benefit_start на благо под родительским работника, который имеет такое же имя выгоды как зависимую имя выгоды ? (Заметьте, что я не знаю заранее, что такое буквальное значение, я не могу просто искать «ABC», мне нужно сопоставить любое значение в элементе списка преимуществ зависимого.

Я пытаюсь:

../../../benefits/benefit[benefitname=??what??]/benefit_start

Я не знаю, как ссылаться на предок текущего узла в середине в xpath (так как я думаю «.» в точке, где у меня есть ??, что будет ссылаться на на льготный узел сотрудника/пособия.

EDIT: Я думаю то, что я хочу, это «current()/Benefname», где? является. Кажется, работать с саксоном, я еще не пробовал его в инструменте etl.

ответ

1

Ваш XML некорректен, и я не думаю, что вы очень хорошо описали ваше siduation (XPath, который вы пытаетесь, имеет пучок ../../ s в начале, но вы не сказали, что контекстный узел есть ли вы итерацию через определенные узлы, или что.

Предположив текущий узел контекста были employee элемента, можно выбрать benefit_start сек, которые соответствуют зависимым выгодам с

benefits/benefit[benefitname = ../../dependent/benefits/benefit/benefitname] 
                     /benefit_start 

Если текущий узел контекста является элементом benefit в dependents раздел, и вы хотите, чтобы получить соответствующий benefit_start для всего текущего benefit элемента, вы можете сделать:

../../../benefits/benefit[benefitname = current()/benefitname]/benefit_start 

Что я и думаю, что вы уже открыли.

+0

(+1) Хорошее решение. Просто сомневаюсь: это 'current()' стандартная функция XPath? (Или это XLST или XQuery или другое?) – acdcjunior

+0

@acdcjunior 'current()' является частью XSLT. Это не в спецификации XPath, это позор, потому что это очень полезно. – JLRishe

+0

Да, действительно. Спасибо за разъяснения! – acdcjunior

 Смежные вопросы

  • Нет связанных вопросов^_^