2010-11-03 2 views
0

Учитывая следующее, я хотел бы, чтобы извлечь VarVal1, VarVa5 и VarText где FixedVals, ну, фиксированный :)с помощью XPath для получения комплексных значений

<TypeA Attr1="VarVal1"> 
    <TypeB Attr2="FixedVal2"> 
     <TypeC Attr3="FixedVal3"> 
      <TypeD Attr4="FixedVal4" Attr5="VarVal5"> 
       VarText 
      </TypeD> 
     </TypeC> 
    </TypeB> 
</TypeA> 

Обратите внимание, что для меня большая проблема в том, что контекст важен. Я хочу полный шаблон. Там может быть и другие узлы TypeA, но я не заинтересован в их значении, если они не следует

<TypeB Attr2="FixedVal2"> 
     <TypeC Attr3="FixedVal3"> 
      <TypeD Attr4="FixedVal4" Attr5="VarVal5"> 
       VarText 
      </TypeD> 
     </TypeC> 
    </TypeB> 

Других слова, что я заинтересован в это набор tripletts, каждый из них в форма (VarVal1, VarVal5, VarText)

+0

Я пропустил указание, что TypeA может происходить в других местах текста, и меня интересуют только те экземпляры, за которыми следуют TypeB, TypeC и TypeD с определенными фиксированными значениями. Я отредактирую. – Avi

+0

Означает ли это, что это не какой-либо элемент 'TypeA', а один, содержащий' TypeB', 'TypeC' и т. Д.? – 2010-11-03 19:54:44

+0

@Alejandro: Да, может быть много элементов TypeA, но я ТОЛЬКО интересуюсь теми, которые содержат TypeB, TypeC и т. Д. – Avi

ответ

2

Этих выражения XPath:

//TypeA 
[TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"]] 
/@Attr1 

Тогда те, которые уже размещено:

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 
    /@Attr5 

И

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 

Вы также мог бы объединить их с оператором множества | союза , Но в зависимости от языка хоста вам лучше выбрать нужный элемент TypeA (первое выражение с последней частью /@Attr1), а затем запросить каждый из них, чтобы извлечь оставшиеся значения.

+0

Я думаю, что понимаю. Каждое из этих выражений возвращает список с N значениями (то есть ValVar1A, ValVar1B, ... ValVar1Z, а затем ValVar5A, ValVar5B, ... ValVar5Z, за которыми следуют VarTextA, VarTextB ... VarTextZ, и мне нужно объединить n'th элемент из каждого, чтобы убрать n-й триплет? – Avi

+0

@Avi: Да, вы правы! Проблема с '' 'union set operator заключается в том, что в большинстве случаев каждый движок XPath приведет к сортировке узлов по порядку документа, но вы выиграли ' Убедитесь, что некоторые 'TypeA' не содержат некоторые другие узлы. – 2010-11-03 23:03:30

0

Я думаю, что вам нужно несколько запросов для этого (может быть неправильно, хотя)

для VarVal1

//TypeA/@Attr1 

для VarVal5

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 
    /@Attr5 

Подумайте они должны сделать трюк

EDIT - пропущенный VarText!

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 
+0

Остерегайтесь 'text()', иногда лучше [не использовать его] (http://www.xquery.com/tips_and_tricks/using_text_in_XPath.html). –

+0

Спасибо, что не знал об этом. Я буду обновлять свой ответ соответственно –

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