2013-03-25 2 views
0

Дано:XPath для конкатенации родительских и атрибутов ребенка значения в одном запросе

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<report Id="0" > 
<property name="comments">comment</property> 
<property name="test">sdcs</property> 
<property name="test">csd</property> 
<property name="eventHandlerClass">sdcs</property> 
</report> 
<report Id="1"> 
<property name="comments">comment</property> 
<property name="test">dcs</property> 
<property name="test">gds</property> 
<property name="test">jds</property> 
<property name="eventHandlerClass">sdcs</property> 
</report> 
</root> 

Ожидаемая мощность:

Id=0, test=sdcs 
Id=0, test=csd 
Id=1, test=dcs 
Id=1, test=gds 
Id=1, test=jds 

только ищет простой Xpath 1,0 для достижения этой цели. Пробовал функции и предикаты varioud, но не смог получить выход, как указано выше. По существу, после прочтения я должен быть в состоянии определить, к какому «тесту» принадлежит идентификатор отчета.

Пробовал:

/root/report/@Id | /root/report/property[@name="test"] - Но дает результат в отдельных строках

/root/report/ (@Id | property[@name="test"]) - Но дает результат в отдельных строках

concat(/root/report/@Id, /root/report/property[@name="test"]) - дает ошибку (думаю Concat работает на результат одной линии)

string-join(/root/report/@Id | /root/report/property[@name="test"] , ',') - Все идет как одна строка, даже два идентификатора отчета.

ответ

1

Вы можете использовать для для того, чтобы сохранить идентификатор в переменной:

for $report in /root/report 
return for $property in $report/property[@name="test"] 
return concat("Id=", $report/@Id, ", ", $property/@name, "=", $property) 

или короче:

for $report in /root/report return 
$report/property[@name="test"]/ 
concat("Id=", $report/@Id, ", ", @name, "=", .) 
+0

То есть именно то, что мне нужно! Но, к сожалению, недоступно в XPath 1.0! –

+0

Я не думаю, что это возможно в XPath 1, так как вы можете выбрать каждый узел только один раз и значения только в конце. Если не существует жесткого ограничения на размер (например, только два узла отчета) (и ваш второй пример - XPath 2, а не 1, не так ли?) – BeniBela

+0

Да, это XPath 2. Я пытался использовать разные варианты без проверки в реальной системе. С вашим решением поняли, что у меня есть ограничение на использование XPath 1.0. –

0

вы можете сделать это довольно элегантно с помощью решений первичных «элементов итерации» быть самым глубоким ребенком - в этом примере корневой элемент XML - ТАБЛИЦА. Посмотрите, как мы «повторяем» более глубокого ребенка, называемого COLUMN. Мы @name колонны (второй), и добавить атрибут @name в parent's-родителя

/TABLE/COLUMNS/COLUMN/concat(../../@name, ' : ', @name) 

Это устраняет необходимость использовать переменную для @name родителя

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

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