Повторить атрибут с помощью xmlstarlet

Я пытаюсь использовать XMLstarlet для преобразования некоторых данных из формата XML в CSV. Мои данные отформатированы как

<!-- mydata.xml -->
<alldata>
    <data id="first">
        <coord><x>0</x><y>5</y></coord>
        <coord><x>1</x><y>4</y></coord>
        <coord><x>2</x><y>3</y></coord>
    </data>
    <data id="second">
        <coord><x>3</x><y>2</y></coord>
        <coord><x>4</x><y>1</y></coord>
        <coord><x>5</x><y>0</y></coord>
    </data>
</alldata>

Я хотел бы отформатировать эти данные в трех столбцах «id», «x» и «y», чтобы получить:

first;0;5
first;1;4
first;2;3
second;3;2
second;4;1
second;5;0

Мои попытки с XMLstarlet не увенчались успехом, что указывает на то, что я действительно не понимаю, что делаю.

xml sel -T -t -m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)" -n mydata.xml

дает мне:

first0;5
1;4
2;3
3;2
4;1
5;0
second0;5
1;4
2;3
3;2
4;1
5;0

это не то, что я хочу или ожидал. Можно ли изменить мой запрос, чтобы получить желаемый результат?


person Martin Heller    schedule 02.07.2013    source источник


Ответы (1)


-m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)"

Основная проблема заключается в -m /alldata/data/coord: это соответствует всем элементам coord во всем документе, то, что вам действительно нужно, это только coord под текущими элементами data:

-m /alldata/data -v "@id" -m coord -v "concat(x,';',y)"

Вам также нужен id в каждой строке, поэтому вам нужно перейти во внутренний цикл:

-m /alldata/data -m coord -v "concat(../@id,';',x,';',y)"

На данный момент нет смысла иметь 2 вложенных цикла, поэтому мы можем упростить:

xml sel -T -t -m /alldata/data/coord -v "concat(../@id,';',x,';',y)" -n mydata.xml
person npostavs    schedule 04.07.2013