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  
Другие вопросы по тегам