xmlstarlet Fritzbox XML电话簿转VCARD

时间:2018-08-19 17:56:23

标签: vcard xmlstarlet fritzbox phonebook

我正在尝试将XML电话簿(Fritzbox格式)转换为VCARD格式。 稍后,我想使用Winmerge或Meld将创建的vcard文件与其他来源的vcard导出合并。

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>

我可以使用xmlstarlet将其转换为vcard:

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

输出:

begin:vcard
n:Paul Tiger
tel;cell:071150885524
tel;home:
end:vcard

这就是我想要的:

begin:vcard
n:Paul Tiger
tel;cell:071150885524
end:vcard

问题是,如果不存在任何元素,如何抑制vtel标签,例如“ tel; home:”。

1 个答案:

答案 0 :(得分:0)

深入研究之后,我发现必须使用条件(--if)。

std::function