繁体   English   中英

使用 xmlstarlet 添加 2 个或更多子节点

add 2 or more subnodes with xmlstarlet

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想使用 xmlstarlet 来实现这个结果

<mrd:transferOptions>
            <mrd:MD_DigitalTransferOptions>
               <mrd:onLine>
                  <cit:CI_OnlineResource>
                     <cit:linkage>
                        <gco:CharacterString>text</gco:CharacterString>
                     </cit:linkage>
                     <cit:protocol>
                        <gco:CharacterString>WWW:LINK-1.0-http--link</gco:CharacterString>
                     </cit:protocol>
                     <cit:name>
                        <gco:CharacterString>text 1</gco:CharacterString>
                     </cit:name>
                     <cit:description>
                        <gco:CharacterString>Text 2</gco:CharacterString>
                     </cit:description>
                     <cit:function>
                        <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode"
                                                   codeListValue="doi"/>
                     </cit:function>
                  </cit:CI_OnlineResource>
               </mrd:onLine>
            </mrd:MD_DigitalTransferOptions>
</mrd:transferOptions>

要添加到我的 XSL 文件中,我使用以下代码:

xmlstarlet ed -N mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" -N mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" -N cit="http://standards.iso.org/iso/19115/-3/cit/2.0" -N gco="http://standards.iso.org/iso/19115/-3/gco/1.0" \
--subnode "//mdb:distributionInfo/mrd:MD_Distribution" -t elem -n 'mrd:transferOptions' -v "" \
--subnode '$prev' -t elem -n 'mrd:MD_DigitalTransferOptions' -v "" \
--subnode '$prev' -t elem -n 'mrd:onLine' -v "" \
--subnode '$prev' -t elem -n 'cit:CI_OnlineResource' -v "" \
--subnode '$prev' -t elem -n 'cit:linkage' -v "" \
--subnode '$prev' -t elem -n 'gco:CharacterString' -v "text" \
filx.xsl

创建我的 xml 的第一部分,直到元素 cit:linkage

如何添加剩余的元素?

我尝试了这样的方法来添加元素 cit:protocol

xmlstarlet ed -N mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" -N mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" -N cit="http://standards.iso.org/iso/19115/-3/cit/2.0" -N gco="http://standards.iso.org/iso/19115/-3/gco/1.0" \
--subnode "//mdb:distributionInfo/mrd:MD_Distribution" -t elem -n 'mrd:transferOptions' -v "" \
--subnode '$prev' -t elem -n 'mrd:MD_DigitalTransferOptions' -v "" \
--subnode '$prev' -t elem -n 'mrd:onLine' -v "" \
--subnode '$prev' -t elem -n 'cit:CI_OnlineResource' -v "" \
--subnode '$prev' -t elem -n 'cit:linkage' -v "" \
--subnode '$prev' -t elem -n 'gco:CharacterString' -v "https://doi.org/10.48784/15c8945c-534a-11ec-a1d1-02000a08f41d" \
--append  '($prev)[last()]' -t elem -n 'cit:protocol' -v '' \
--subnode '$prev' -t elem -n 'gco:CharacterString' -v "WWW:LINK-1.0-http--link" \
file.xsl

但结果不正确。 你能告诉我我做错了什么吗?

1 个回复

$prev反向引用由每个-i-a-s选项重新定义,因此将cit:CI_OnlineResource节点保存在变量中:

  -s '$prev' -t elem -n 'cit:CI_OnlineResource' \
  --var CI '$prev' \
  -s '$CI' -t elem -n 'cit:linkage' \
  -s '$prev' -t elem -n 'gco:CharacterString' -v 'text' \
  # etc.

-s (--subnode) xpath添加一个节点作为xpath的最后一个子节点。 或者,使用 append 兄弟节点的-a (--append)选项。

2 如何搜索XML节点并使用xmlstarlet添加或删除它

我尝试创建一个shell脚本,在XML文件中搜索属性,如果不存在则创建具有给定属性的元素,或者如果属性存在则删除元素。 这是XML文件: 到目前为止这是我的Shellscript: 预期的产出是 但我的脚本是这样的: 如何更改shell脚本以达到目标。 首 ...

3 XML标签的更多子节点

我正在解析XML文件。 我正在使用DOM解析器。 我有3个标记为Layer的子节点,但我有7个子节点。所有4个子节点均为空。 如果我没有正确数量的子节点,我该如何解析子节点。 我的XML文件代码段是 ...

4 知道谁是具有更多子节点的元素

我对XML文档进行投票。 我必须知道有更多票数的提议,我该怎么办? 我正在使用XSLT进行转换,但找不到解决方法。 XML: 在这个例子中,第一个描述应该是获胜者的提议。 ...

5 VueJS addRoutes添加更多子路由

实现语言切换器,并有最后(希望如此)失踪的难题。 我定义了这些路线: 我有一些来自后端的路由,我将这些路由添加到现有的这样: 这适用于非儿童路线。 但我需要把这些路线放在path: '/:lang',作为孩子。 ...

6 添加一个几乎正确的 xmlstarlet 的新子节点

无法弄清楚如何得到我想要的:添加一个具有属性的新子节点: 给我 据我所知,这是有效的 xml,但对于使用和定义文件的应用程序来说是不可接受的。 有没有办法说服 xmlstarlet 产生输出: 提前致谢! ...

9 添加更多子级时如何自动更改div边框

我的标记如下所示: 我从XML文件中读取问题,并以HTML格式显示。 现在,当单击和代码为时,我想为每个问题添加答案: CSS代码: 如您所见,每个问题都在边界内。 我想在问题div的同一边框内单击时添加答案。 我该如何管理? 有什么建议么? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM