2016-02-26 3 views
0

Предполагая, что у меня есть такой файл XML:условия внутри одного вызова XMLStarlet

<view> 
    <field table="alice" name="fish"/> 
    <field id="confirmation" controlType="button" enabled="some-condition"> 
    <title>Confirm...</title> 
    </field> 
    <field table="bob" name="cat"/> 
    <field table="bob" name="dog" hidden="true"/> 
</view> 

Я хочу, чтобы вывести все свои поля, но вывод обусловливающие атрибутов , которые присутствуют.

Ожидаемый результат:

field 'alice.fish' 
button "Confirm..." (enabled: some-condition) 
field 'bob.cat' 
field 'bob.dog' (hidden: true) 

Текущий результат:

field 'alice.fish' (hidden:) 
field '.' (hidden:) 
field 'bob.cat' (hidden:) 
field 'bob.dog' (hidden: true) 
"" (enabled:) 
button "confirm" (enabled: some-condition) 
"" (enabled:) 
"" (enabled:) 

через 2 звонки на XMLStarlet:

xmlstarlet sel -t -m "//field" -o "field '" -v "@table" -o "." -v "@name" -o "' (hidden: " -v "@hidden" -o ")" -n $1 
xmlstarlet sel -t -m "//field" -v "@controlType" -o " \"" -v "@id" -o "\" (enabled: " -v "@enabled" -o ")" -n $1 

ли можно превратить 3 различных типов результатов в 1 звоните в XmlStarlet, чтобы они оставались в оригинальной заказ?

ответ

0

Вам необходимо использовать опцию --if (--break обозначает конец структуры управления током).

xmlstarlet sel --text -t -m "//field" \ 
    --if "@controlType='button'" \ 
     -v "@controlType" -o " \"" -v "title" -o "\" (enabled: " -v "@enabled" -o ")" \ 
    --else \ 
     -o "field '" -v "@table" -o "." -v "@name" -o "'" \ 
     --if "@hidden" -o " (hidden: " -v "@hidden" -o ")" --break \ 
    --break \ 
    -n "$1" 
+0

Практически там! Я бы хотел, чтобы текст между тегами 'title', в случае кнопки. Можете ли вы показать мне, как это получить? - Не настоящий новичок в XPath. – user3341592

+0

Я имел в виду: настоящий XPath новичок здесь! – user3341592

+0

Просто замените '@ id' на' title'. – npostavs