Итерация по XML с помощью xmlstarlet

У меня есть следующий XML:

<?xml version="1.0" encoding="UTF-8"?>
<test-report>
<testsuite>
<test name="RegisterConnection1Tests">
<testcase name="testRregisterConnection001"></testcase>
<testcase name="testRegisterConnection002"></testcase>
</test>
<test name="RegisterConnection2Tests">
<testcase name="testRregisterConnection001"></testcase>
<testcase name="testRegisterConnection002"></testcase>
</test>
</testsuite>
</test-report>

И я хочу, чтобы результат:

RegisterConnection1Tests,testRregisterConnection001
RegisterConnection1Tests,testRregisterConnection002
RegisterConnection2Tests,testRregisterConnection001
RegisterConnection2Tests,testRregisterConnection002

Я не понимаю, как показать детям, как я ожидал

xmlstarlet sel -t -m 'test-report/testsuite/test' -v '@name' -v '//testcase/@name' -n $1 для работы, хотя он только вводит:

RegisterConnection1TeststestRregisterConnection001
RegisterConnection2TeststestRregisterConnection001

person hendry    schedule 18.06.2010    source источник


Ответы (1)


Чтобы добавить отсутствующую запятую, вы можете добавить еще одну -v "','" Во втором столбце вы выбираете с абсолютным выражением xpath из корневого элемента, а не из элемента, соответствующего шаблону, двойные косые черты неверны. Поскольку вам нужна одна строка для каждого теста. Я бы перебирал элементы теста, а затем добавлял атрибут имени родительского элемента следующим образом:

xmlstarlet sel -t -m 'test-report/testsuite/test/testcase' -v '../@name' -v "','" -v '@name' -n $1
person Jörn Horstmann    schedule 18.06.2010
comment
Нет, все же неправильно. $ xmlstarlet sel -t -m 'отчет о тестах/набор тестов/тест' -v '@name' -v ',' -v 'testcase/@name' -n test.xml RegisterConnection1Tests,testRregisterConnection001 RegisterConnection2Tests,testRregisterConnection001 - person hendry; 18.06.2010
comment
ах, не знал, что вы можете сделать что-то вроде ../ parent. Умная! - person hendry; 18.06.2010
comment
-o , эквивалентно -v "','" - person npostavs; 08.08.2012