Пример XML:
<hosts>
<host>
<name>Server A</name>
<status>0</status>
<groups>
<group>
<name>Discovered hosts</name>
</group>
</groups>
<interfaces>
<interface>
<ip>10.1.2.3</ip>
</interface>
</interfaces>
</host>
<host>
<name>Server B</name>
<status>0</status>
<groups>
<group>
<name>Discovered hosts</name>
</group>
</groups>
<interfaces>
<interface>
<ip>10.1.2.4</ip>
</interface>
</interfaces>
</host>
</hosts>
Я пытаюсь экспортировать записи в файл CSV следующим образом:
Discovered hosts,Server A,10.1.2.3,0
Discovered hosts,Server B,10.1.2.4,0
с xmlstarlet
, направляющими с:
Может быть несколько опций --match, --copy-of, --value-of и т.д. в
один шаблон. Эффект от применения шаблонов командной строки может быть
иллюстрируется следующим аналогом XSLT
xml sel -t -c "xpath0" -m "xpath1" -m "xpath2" -v "xpath3" \
-t -m "xpath4" -c "xpath5"
Но мой результат отличается от ожидаемого:
$ xmlstarlet sel -t \
-m "//host/groups/group/name" -v . -o "," \
-m "//host/name" -v . -o "," \
-m "//host/interfaces/interface/ip" -v . -o "," \
-m "//host/status" -v . -n sample.xml
Discovered hosts,Server A,10.1.2.3,0
0
10.1.2.4,0
0
Server B,10.1.2.3,0
0
10.1.2.4,0
0
Discovered hosts,Server A,10.1.2.3,0
0
10.1.2.4,0
0
Server B,10.1.2.3,0
0
10.1.2.4,0
0
Очевидно, что можно использовать grep
как обходной путь (именно это я и сделал), но я хочу понять, как правильно его использовать и что послужило причиной этого неочевидного поведения.