2009-12-29 5 views
4

Я не очень хорошо знаком с xpath. Но я работал с выражениями xpath и устанавливал их в базе данных. На самом деле это просто инструмент BAM для biztalk.XPath concat несколько узлов

Во всяком случае, у меня есть XML, который может выглядеть как:

<File> 
    <Element1>element1<Element1> 
    <Element2>element2<Element2> 
    <Element3> 
    <SubElement>sub1</SubElement> 
    <SubElement>sub2</SubElement> 
    <SubElement>sub3</SubElement> 
    <Element3> 
</File> 

мне было интересно, если есть способ, чтобы использовать выражение XPath получать все Подэлементы concatted? В настоящий момент я использую:

/*[local-name()='File']/*[local-name()='Element3']/*[local-name()='SubElement'] 

Это работает, если у него есть только один индекс. Но, по-видимому, мой xml иногда имеет больше узлов, поэтому он дает NULL. Я мог бы просто использовать

/*[local-name()='File']/*[local-name()='Element3']/*[local-name()='SubElement'][0] 

, но мне нужны все узлы. Есть ли способ сделать это?

Большое спасибо!

Edit: Я изменил XML, я был неправ, это другое, это должно выглядеть следующим образом:

<item> 
    <element1>el1</element1> 
    <element2>el2</element2> 
    <element3>el3</element3> 
    <element4> 
     <subEl1>subel1a</subEl1> 
     <subEl2>subel2a</subEl2> 
    </element4> 
    <element4> 
     <subEl1>subel1b</subEl1> 
     <subEl2>subel2b</subEl2> 
    </element4> 
</item> 

И мне нужно иметь код на одну строку, чтобы получить результат, как: «subel2a subel2b» ;

Мне нужна одна строка, потому что я устанавливаю это выражение xpath как атрибут xml (не мой выбор, он указан). Я попробовал string-join, но он не работает.

+0

Не должно быть '' во второй раз? – Anthony

+0

Нет, это целая точка – WtFudgE

ответ

5

string-join(/file/Element3/SubElement, ',')

+7

К сожалению, string-join() не находится в XPath 1.0. :-( – danorton

0

/File/Element3/SubElement будет соответствовать всем элементам SubElement в вашем примере XML. Что вы используете для его оценки?

Если ваш метод оценки подчиняется «правилу первого узла», он будет соответствовать только первому. Если вы используете метод, возвращающий набор узлов, он возвращает все из них.

0

Вы можете получить все подэлементы с помощью:

//SubElement 

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

//parent::SubElement 

После того, как вы есть, что вы могли бы (в зависимости от языка программирования) перебрать родителей и сцепить Подэлементы.

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