合并xml元素属性
我有一个输入xml合并xml元素属性,xml,xml-parsing,xmlstarlet,Xml,Xml Parsing,Xmlstarlet,我有一个输入xml <IndexCatalogueRecord SeriesNumber="1" SeriesVolume="3" SeriesPage="594"> <IndexCatalogueID>10305941390</IndexCatalogueID> <GeneralNote>[Shelved in: B.58]</GeneralNote> <GeneralNote>[Shelved in: B.458]<
<IndexCatalogueRecord SeriesNumber="1" SeriesVolume="3" SeriesPage="594">
<IndexCatalogueID>10305941390</IndexCatalogueID>
<GeneralNote>[Shelved in: B.58]</GeneralNote>
<GeneralNote>[Shelved in: B.458]</GeneralNote>
<GeneralNote>[Shelved in: B.20]</GeneralNote>
<Language>fr</Language>
</IndexCatalogueRecord>
但是,当我试图通过管道将控制台输出传输到grep,让它剥离匹配字符串“[搁置在:”和“]”时,我遇到了一些问题,请告诉我是否有更优雅的解决方案。提前感谢一种可能的方法是使用两个嵌套的
xmlstarlet
命令(注意表达式中出现的两个文件名): 内部
xmlstarlet
命令从所有GeneralNote
元素创建最终值,外部命令更新第一个GeneralNote
元素并删除另一个元素。在xmlstarlet中,ed
是编辑值模式,sel
是选择值模式
-表示更新值-u
-通过XPath检索值-v
-迭代匹配XPath表达式的所有节点-m
-输出一个静态字符串-o
-结束迭代或if子句-b
-删除与XPath匹配的所有节点-d
xmlstarlet ed
后面添加一个-L
选项
<IndexCatalogueRecord SeriesNumber="1" SeriesVolume="3" SeriesPage="594">
<IndexCatalogueID>10305941390</IndexCatalogueID>
<GeneralNote>[Shelved in: B.58, B.458, B.20]</GeneralNote>
<Language>fr</Language>
</IndexCatalogueRecord>
xmlstarlet sel -t -m "//GeneralNote" -v . -n test.xml
xmlstarlet ed -u "/IndexCatalogueRecord/GeneralNote[1]" \
-v "$(xmlstarlet sel -t -o "[Shelved in: " -m "/IndexCatalogueRecord/GeneralNote" \
-v "substring-after(substring-before(.,']'),'[Shelved in: ')" \
--if 'position() != last()' -o ', ' -b -b -o "]" input.xml)" \
-d "/IndexCatalogueRecord/GeneralNote[position() > 1]" input.xml