2016-11-10 5 views
1

У меня есть следующее содержание XML:Регистрация нескольких конкатенации атрибутов со значениями узлов с использованием XPath

<ns2:ItemAttributes xml:lang="de-DE"> 
    <ns2:Creator Role="Role1">Creator One</ns2:Creator> 
    <ns2:Creator Role="Role2">Creator Two</ns2:Creator> 
    <ns2:Creator Role="Role3">Creator Three</ns2:Creator> 
</ns2:ItemAttributes> 

Я пытаюсь форматировать и объединить это в одну строку с помощью XPath. Что-то вроде:

string-join(//ns2:Creator/concat(./text(), @Role), ', ') 

Я думаю, я где-то близко, потому что это:

string-join(//ns2:Creator/@Role , ', ') 

работ и дает мне разделенный запятыми список ролей: Role1, роль2, Role3

и это

string-join(//ns2:Creator/node(), ', ') 

сочетает в себе ценности создателей: «Создатель One, Создатель T wo, Творца Трое ».

Я хотел бы окончательный вывод

Role1: Creator One, Role2: Creator Two, Role3: Creator Three 

Не могли бы вы помочь.

+0

Немного ближе, используя: string-join (// ns2: Creator/(@ Role, node()), ',') Теперь у меня есть все значения, но не все: они все запятые -сепаратированный –

ответ

0

Вы должны выбрать @Role в качестве первого параметра ваш призыв к concat(), и использовать ., чтобы выбрать значение строки контекстного узла:

string-join($xml//ns2:Creator/concat(@Role, ': ', .), ', ') 

Вместо . вы также можете использовать string() или string(.), которые делает явное преобразование, что в противном случае произойдет бы неявно:

string-join($xml//ns2:Creator/concat(@Role, ': ', string(.)), ', ') 

Возвращает:

Role1: Creator One, Role2: Creator Two, Role3: Creator Three 
+0

Спасибо, но почему-то в этом случае я не получаю значения. Выход будет: ":,:" Таким образом, он ловит два элемента, двоеточие с пробелом, но не получает значений –

+0

@EugeneBykov. Тогда я подозреваю, что вы что-то изменили ни по запросу, ни по данным, потому что я проверил это по тем же данным, которые вы предоставили в своем вопросе, и вывод правильный. – wst

+0

Это внутри teiid sql, может быть, это важно ... Обработка concat, например ... –