首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmlstarlet Fritzbox XML电话簿到VCARD

xmlstarlet Fritzbox XML电话簿到VCARD
EN

Stack Overflow用户
提问于 2018-08-20 01:56:23
回答 1查看 125关注 0票数 0

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

有一条记录没有电话号码/ Test.xml @type=‘home’元素的类型:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
begin:vcard
n:Paul Tiger
tel;cell:071150885524
tel;home:
end:vcard

这就是我想要的:

代码语言:javascript
复制
begin:vcard
n:Paul Tiger
tel;cell:071150885524
end:vcard

问题是,如果不存在任何元素,我如何抑制像“tel;home:”这样的vcard标记。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 02:44:14

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

代码语言:javascript
复制
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  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51920381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档