xmlstarlet Fritzbox XML телефонная книга для VCARD
Я пытаюсь преобразовать телефонную книгу XML (формат Fritzbox) в формат VCARD. Позже я хочу объединить созданный файл vcard с экспортом vcard из других источников, используя Winmerge или Meld.
Test.xml с одной записью без элемента телефонии / номера [@type='home']:
<phonebooks>
<phonebook name="Telefonbuch">
<contact>
<category/>
<person>
<realName>Paul Tiger</realName>
</person>
<telephony nid="4">
<number type="work" id="1" vanity="" prio="1">071150885524</number>
</telephony>
<services/>
</contact>
</phonebook>
</phonebooks>
Я могу преобразовать его в vcard, используя xmlstarlet:
xmlstarlet \
sel -t -m /phonebooks/phonebook/contact \
-o "begin:vcard" -n \
-v "concat('n:',person/realName)" -n \
-v "concat('tel;cell:',telephony/number[@type='work'])" -n \
-v "concat('tel;home:',telephony/number[@type='home'])" -n \
-o "end:vcard" -n \
-n test.xml
Ouptut:
begin:vcard
n:Paul Tiger
tel;cell:071150885524
tel;home:
end:vcard
Это то, что я хотел бы:
begin:vcard
n:Paul Tiger
tel;cell:071150885524
end:vcard
Вопрос в том, как я могу подавить теги vcard, такие как "tel;home:", если ни один элемент не существует.
1 ответ
Покопавшись, я обнаружил, что необходимо использовать условие (--if).
xmlstarlet \
sel -t -m /phonebooks/phonebook/contact \
-o "BEGIN:VCARD" -n \
-o "VERSION:2.1" -n \
-v "concat('FN:',person/realName)" -n \
\
--if "telephony/number[@type='work'] != ''" \
-v "concat('TEL;WORK;VOICE:',telephony/number[@type='work'])" -n \
--break \
\
--if "telephony/number[@type='home'] != ''" \
-v "concat('TEL;HOME;VOICE:',telephony/number[@type='home'])" -n \
--break \
\
--if "telephony/number[@type='mobile'] != ''" \
-v "concat('TEL;CELL;VOICE:',telephony/number[@type='mobile'])" -n \
--break \
-o "END:VCARD" -n -n \
FB.xml