使用xmlstarlet将NewTempP元素结构复制到同级fig元素中
处理XML:将NewTempP元素完整复制到同级fig元素中
需求
遍历每个带有属性和子元素的NewTempP元素,将其完整结构(包含所有属性、子元素)复制到同级的fig元素中作为子元素。
原始XML示例
<sec> <NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg"> <alt-text>Describes a picture</alt-text> </NewTempP > <p>test</p> <fig> </fig> <NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png"> <alt-text>Describes a picture</alt-text> </NewTempP > <p>test</p> <fig> </fig> …….. </sec>
尝试的无效命令
xmlstarlet ed -L -P -u "//fig[preceding-sibling::*[1][self:: NewTempP/@*]]/inline-graphic" -x "string(../preceding-sibling::NewTempP [1]/@*)" test.xml
该命令无效的原因:试图更新不存在的inline-graphic元素,且仅尝试提取属性文本,没有复制完整的节点结构。
期望结果
<sec> <NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg"> <alt-text>Describes a picture</alt-text> </NewTempP > <p>test</p> <fig> <NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg"> <alt-text>Describes a picture</alt-text> </NewTempP > </fig> <NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png"> <alt-text>Describes a picture</alt-text> </NewTempP > <p>test</p> <fig> <NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png"> <alt-text>Describes a picture</alt-text> </NewTempP > </fig> …….. </sec>
正确解决方案
使用xmlstarlet的copy-of操作,将每个fig对应的前置NewTempP节点完整复制到fig内部:
xmlstarlet ed -L -P -s "//fig" -t copy-of -x "../preceding-sibling::NewTempP[1]" test.xml
命令说明
-L:直接修改原文件-P:保留原始格式(缩进等)-s "//fig":选择所有fig节点作为目标,在其内部添加内容-t copy-of:指定操作类型为复制节点-x "../preceding-sibling::NewTempP[1]":通过XPath找到当前fig节点的前序兄弟节点中第一个NewTempP,复制该节点的完整结构
内容的提问来源于stack exchange,提问作者Ofuuzo
相关产品推荐
相关产品推荐

